[PATCH f20-branch] (v2) network gui spoke: use GDBus to obtain list of settings (#1018467)

Vratislav Podzimek vpodzime at redhat.com
Thu Oct 17 08:16:15 UTC 2013


On Wed, 2013-10-16 at 13:29 +0200, Radek Vykydal wrote:
> Version 2 addresses Brian's review remarks and also replaces one more
> use of list_connections() with GDBus in chunk -474,11 +479,12
> 
> Another step in moving to GDBus.
> libnm-glib (NMRemoteSettings.list_connections()) returns empty list
> when called for the first time.
> ---
>  pyanaconda/installclasses/fedora.py |   2 +-
>  pyanaconda/network.py               |   6 +-
>  pyanaconda/nm.py                    |  52 +++++++++++----
>  pyanaconda/ui/gui/spokes/network.py | 129 +++++++++++++-----------------------
>  4 files changed, 90 insertions(+), 99 deletions(-)
> 
> diff --git a/pyanaconda/installclasses/fedora.py b/pyanaconda/installclasses/fedora.py
> index c433d49..79c1a9b 100644
> --- a/pyanaconda/installclasses/fedora.py
> +++ b/pyanaconda/installclasses/fedora.py
> @@ -49,7 +49,7 @@ class InstallClass(BaseInstallClass):
>                  continue
>              try:
>                  onboot = nm.nm_device_setting_value(devName, "connection", "autoconnect")
> -            except nm.DeviceSettingsNotFoundError:
> +            except nm.SettingsNotFoundError:
>                  continue
>              if not onboot == False:
>                  return
> diff --git a/pyanaconda/network.py b/pyanaconda/network.py
> index 563a680..b7ca246 100644
> --- a/pyanaconda/network.py
> +++ b/pyanaconda/network.py
> @@ -283,7 +283,7 @@ def dumpMissingDefaultIfcfgs():
>          # check that device has connection without ifcfg file
>          try:
>              con_uuid = nm.nm_device_setting_value(devname, "connection", "uuid")
> -        except nm.DeviceSettingsNotFoundError:
> +        except nm.SettingsNotFoundError:
>              continue
>          if find_ifcfg_file([("UUID", con_uuid)], root_path=""):
>              continue
> @@ -293,7 +293,7 @@ def dumpMissingDefaultIfcfgs():
>              log.debug("network: dumping ifcfg file for default autoconnection on %s", devname)
>              nm.nm_update_settings_of_device(devname, [['connection', 'autoconnect', False, None]])
>              log.debug("network: setting autoconnect of %s to False" , devname)
> -        except nm.DeviceSettingsNotFoundError:
> +        except nm.SettingsNotFoundError:
>              log.debug("network: no ifcfg file for %s", devname)
>          rv = True
>  
> @@ -939,7 +939,7 @@ def setOnboot(ksdata):
>          try:
>              nm.nm_update_settings_of_device(devname, [['connection', 'autoconnect', network_data.onboot, None]])
>              ifcfglog.debug("setting autoconnect (ONBOOT) of %s to %s" , devname, network_data.onboot)
> -        except nm.DeviceSettingsNotFoundError as e:
> +        except nm.SettingsNotFoundError as e:
>              log.debug("setOnboot: %s", e)
>  
>  def networkInitialize(ksdata):
> diff --git a/pyanaconda/nm.py b/pyanaconda/nm.py
> index cd8512d..6755883 100644
> --- a/pyanaconda/nm.py
> +++ b/pyanaconda/nm.py
> @@ -52,12 +52,7 @@ class PropertyNotFoundError(ValueError):
>      def __str__(self):
>          return self.__repr__()
>  
> -class SettingNotFoundError(ValueError):
> -    """Setting of NMRemoteConnection was not found"""
> -    def __str__(self):
> -        return self.__repr__()
> -
> -class DeviceSettingsNotFoundError(ValueError):
> +class SettingsNotFoundError(ValueError):
>      """Settings NMRemoteConnection object was not found"""
>      def __str__(self):
>          return self.__repr__()
> @@ -620,12 +615,12 @@ def nm_device_setting_value(name, key1, key2):
>                  by NM
>         :rtype: unpacked GDBus variant or None
>         :raise UnknownDeviceError: if device is not found
> -       :raise DeviceSettingsNotFoundError: if settings were not found
> +       :raise SettingsNotFoundError: if settings were not found
>                                             (eg for "wlan0")
>      """
>      settings_path = _device_settings(name)
>      if not settings_path:
> -        raise DeviceSettingsNotFoundError(name)
> +        raise SettingsNotFoundError(name)
>      proxy = _get_proxy(object_path=settings_path, interface_name="org.freedesktop.NetworkManager.Settings.Connection")
>      args = None
>      settings = proxy.call_sync("GetSettings",
> @@ -637,10 +632,43 @@ def nm_device_setting_value(name, key1, key2):
>      try:
>          value = settings[key1][key2]
>      except KeyError:
> -        #raise SettingNotFoundError(key1, key2)
>          value = None
>      return value
>  
> +def nm_ap_setting_value(ssid, key1, key2):
> +    """Return value of ap's setting specified by key1 and key2.
> +
> +       :param ssid: name of ap (ssid)
> +       :type ssid: str
> +       :param key1: first-level key of setting (eg "connection")
> +       :type key1: str
> +       :param key2: second-level key of setting (eg "uuid")
> +       :type key2: str
> +       :return: value of setting or None if the setting was not found
> +                which means it does not exist or default value is used
> +                by NM
> +       :rtype: unpacked GDBus variant or None
> +       :raise SettingsNotFoundError: if settings were not found
> +                                           (eg for "wlan0")
> +    """
> +    settings_path = _settings_for_ap(ssid)
> +    if not settings_path:
> +        raise SettingsNotFoundError(ssid)
> +    proxy = _get_proxy(object_path=settings_path, interface_name="org.freedesktop.NetworkManager.Settings.Connection")
> +    args = None
> +    settings = proxy.call_sync("GetSettings",
> +                               args,
> +                               Gio.DBusCallFlags.NONE,
> +                               DEFAULT_DBUS_TIMEOUT,
> +                               None)
> +    settings = settings.unpack()[0]
> +    try:
> +        value = settings[key1][key2]
> +    except KeyError:
> +        value = None
> +    return value
> +
> +
>  def nm_activate_device_connection(dev_name, con_uuid):
>      """Activate device with specified connection.
>  
> @@ -707,12 +735,12 @@ def nm_update_settings_of_device(name, new_values):
>                           value:
>                           default_type_str: str
>         :raise UnknownDeviceError: if device is not found
> -       :raise DeviceSettingsNotFoundError: if settings were not found
> +       :raise SettingsNotFoundError: if settings were not found
>                                             (eg for "wlan0")
>      """
>      settings_path = _device_settings(name)
>      if not settings_path:
> -        raise DeviceSettingsNotFoundError(name)
> +        raise SettingsNotFoundError(name)
>      return _update_settings(settings_path, new_values)
>  
>  def _update_settings(settings_path, new_values):
> @@ -958,7 +986,7 @@ def test():
>      if wireless_device:
>          try:
>              nm_update_settings_of_device(wireless_device, [[key1, key2, new_value, None]])
> -        except DeviceSettingsNotFoundError as e:
> +        except SettingsNotFoundError as e:
>              print "%s" % e
>  
>      #nm_update_settings_of_device(devname, [["connection", "id", "test", None]])
> diff --git a/pyanaconda/ui/gui/spokes/network.py b/pyanaconda/ui/gui/spokes/network.py
> index a2dbdcb..1d8eaeb 100644
> --- a/pyanaconda/ui/gui/spokes/network.py
> +++ b/pyanaconda/ui/gui/spokes/network.py
> @@ -43,7 +43,7 @@ from pyanaconda.ui.gui.utils import gtk_call_once, enlightbox
>  from pyanaconda.ui.common import FirstbootSpokeMixIn
>  
>  from pyanaconda import network
> -from pyanaconda.nm import nm_device_setting_value, nm_device_ip_config, nm_activated_devices, nm_device_active_ssid
> +from pyanaconda import nm
>  
>  from gi.repository import GLib, GObject, Pango, Gio, NetworkManager, NMClient
>  import dbus
> @@ -117,11 +117,6 @@ def localized_string_of_device_state(device, state):
>  
>      return s
>  
> -configuration_of_disconnected_devices_allowed = True
> -# it is not in gnome-control-center but it makes sense
> -# for installer
> -# https://bugzilla.redhat.com/show_bug.cgi?id=704119
> -
>  __all__ = ["NetworkSpoke", "NetworkStandaloneSpoke"]
>  
>  class CellRendererSignal(Gtk.CellRendererPixbuf):
> @@ -263,7 +258,6 @@ class NetworkControlBox(object):
>          self._updating_device = False
>  
>          self.client = NMClient.Client.new()
> -        self.remote_settings = NMClient.RemoteSettings()
>  
>          # devices list
>          # limited to wired and wireless
> @@ -386,11 +380,13 @@ class NetworkControlBox(object):
>  
>          log.info("network: access point changed: %s", ssid_target)
>  
> -        con = self.find_connection_for_device(device, ssid_target)
> -        if con:
> -            self.client.activate_connection(con, device,
> -                                            None, None, None)
> -        else:
> +        try:
> +            uuid = nm.nm_ap_setting_value(ssid_target, "connection", "uuid")
> +            nm.nm_activate_device_connection(device.get_iface(), uuid)
> +        except nm.UnmanagedDeviceError as e:
> +            log.debug("network: on_wireless_ap_changed: %s", e)
> +        except nm.SettingsNotFoundError as e:
> +            log.debug("network: on_wireless_ap_changed: %s", e)
>              self.client.add_and_activate_connection(None, device, ap_obj_path,
>                                                      None, None)
>  
> @@ -405,26 +401,36 @@ class NetworkControlBox(object):
>          if not device:
>              return
>  
> -        con = self.find_active_connection_for_device(device)
> -        ssid = None
> -        if not con and configuration_of_disconnected_devices_allowed:
> +        devname = device.get_iface()
> +        uuid = None
> +        try:
> +            uuid = nm.nm_device_active_con_uuid(devname)
> +        except nm.UnknownDeviceError as e:
> +            log.debug("network: on_edit_connection: %s", e)
> +        if not uuid:
>              if device.get_device_type() == NetworkManager.DeviceType.WIFI:
> -                ssid = self.selected_ssid
> -            con = self.find_connection_for_device(device, ssid)
> +                if self.selected_ssid:
> +                    try:
> +                        uuid = nm.nm_ap_setting_value(self.selected_ssid, "connection", "uuid")
> +                    except nm.SettingsNotFoundError as e:
> +                        log.debug("network: on_edit_connection: %s", e)
> +            else:
> +                uuid = nm.nm_device_setting_value(devname, "connection", "uuid")
>  
> -        if con:
> -            uuid = con.get_uuid()
> -        else:
> +        if not uuid:
> +            log.debug("network: on_edit_connection: can't find connection for device %s", devname)
>              return
>  
>          # 871132 auto activate wireless connection after editing if it is not
>          # already activated (assume entering secrets)
>          activate = None
> -        if (device.get_device_type() == NetworkManager.DeviceType.WIFI and ssid
> -            and (nm_device_active_ssid(device.get_iface()) == ssid)):
> -            activate = (con, device)
> +        if (device.get_device_type() == NetworkManager.DeviceType.WIFI
> +            and self.selected_ssid
> +            and self.selected_ssid != nm.nm_device_active_ssid(devname)):
> +            activate = (uuid, devname)
>  
> -        log.info("network: configuring connection %s device %s ssid %s", uuid, device.get_iface(), ssid)
> +        log.info("network: configuring connection %s device %s ssid %s",
> +                 uuid, devname, self.selected_ssid)
>          self.kill_nmce(msg="Configure button clicked")
>          proc = subprocess.Popen(["nm-connection-editor", "--edit", "%s" % uuid])
>          self._running_nmce = proc
> @@ -446,13 +452,12 @@ class NetworkControlBox(object):
>              if self._running_nmce and self._running_nmce.pid == pid:
>                  self._running_nmce = None
>              if activate:
> -                con, device = activate
> -                gtk_call_once(self._activate_connection_cb, con, device)
> +                uuid, devname = activate
> +                gtk_call_once(self._activate_connection_cb, uuid, devname)
>              network.logIfcfgFiles("nm-c-e run")
>  
> -    def _activate_connection_cb(self, con, device):
> -        self.client.activate_connection(con, device,
> -                                        None, None, None)
> +    def _activate_connection_cb(self, uuid, devname):
> +        nm.nm_activate_device_connection(devname, uuid)
>  
>      def on_wireless_enabled(self, *args):
>          switch = self.builder.get_object("device_wireless_off_switch")
> @@ -474,11 +479,12 @@ class NetworkControlBox(object):
>                          NetworkManager.DeviceType.BOND,
>                          NetworkManager.DeviceType.VLAN):
>              if active:
> -                cons = self.remote_settings.list_connections()
> -                dev_cons = device.filter_connections(cons)
> -                if dev_cons:
> -                    self.client.activate_connection(dev_cons[0], device,
> -                                                    None, None, None)
> +                uuid = nm.nm_device_setting_value(device.get_iface(), "connection", "uuid")
> +                if uuid:
> +                    try:
> +                        nm.nm_activate_device_connection(device.get_iface(), uuid)
> +                    except nm.UnmanagedDeviceError as e:
> +                        log.debug("network: on_device_off_toggled: %s", e)
>                  else:
>                      self.client.add_and_activate_connection(None, device, None,
>                                                              None, None)
> @@ -521,47 +527,6 @@ class NetworkControlBox(object):
>              return None
>          return model.get(itr, DEVICES_COLUMN_OBJECT)[0]
>  
> -    def find_connection_for_device(self, device, ssid=None):
> -        dev_type = device.get_device_type()
> -        cons = self.remote_settings.list_connections()
> -        for con in cons:
> -            con_type = con.get_setting_connection().get_connection_type()
> -            if dev_type == NetworkManager.DeviceType.ETHERNET:
> -                if con_type != NetworkManager.SETTING_WIRED_SETTING_NAME:
> -                    continue
> -                settings = con.get_setting_wired()
> -                con_hwaddr = ":".join("%02X" % ord(bytechar)
> -                                      for bytechar in settings.get_mac_address())
> -                if con_hwaddr == device.get_hw_address():
> -                    return con
> -            elif dev_type == NetworkManager.DeviceType.WIFI:
> -                if con_type != NetworkManager.SETTING_WIRELESS_SETTING_NAME:
> -                    continue
> -                settings = con.get_setting_wireless()
> -                if ssid == settings.get_ssid():
> -                    return con
> -            elif dev_type == NetworkManager.DeviceType.BOND:
> -                if con_type != NetworkManager.SETTING_BOND_SETTING_NAME:
> -                    continue
> -                settings = con.get_setting_bond()
> -                if device.get_iface() == settings.get_virtual_iface_name():
> -                    return con
> -            elif dev_type == NetworkManager.DeviceType.VLAN:
> -                if con_type != NetworkManager.SETTING_VLAN_SETTING_NAME:
> -                    continue
> -                settings = con.get_setting_vlan()
> -                if device.get_iface() == settings.get_interface_name():
> -                    return con
> -            else:
> -                return None
> -
> -    def find_active_connection_for_device(self, device):
> -        cons = self.client.get_active_connections()
> -        for con in cons:
> -            if con.get_devices()[0] is device:
> -                return self.remote_settings.get_connection_by_path(con.get_connection())
> -        return None
> -
>      def _device_is_stored(self, nm_device):
>          """Check that device with Udi of nm_device is already in liststore"""
>          udi = nm_device.get_udi()
> @@ -689,8 +654,8 @@ class NetworkControlBox(object):
>          elif dev_type == NetworkManager.DeviceType.VLAN:
>              dt = "wired"
>  
> -        ipv4cfg = nm_device_ip_config(device.get_iface(), version=4)
> -        ipv6cfg = nm_device_ip_config(device.get_iface(), version=6)
> +        ipv4cfg = nm.nm_device_ip_config(device.get_iface(), version=4)
> +        ipv6cfg = nm.nm_device_ip_config(device.get_iface(), version=6)
>  
>          if ipv4cfg and ipv4cfg[0]:
>              addr_str, prefix, gateway_str = ipv4cfg[0][0]
> @@ -782,7 +747,7 @@ class NetworkControlBox(object):
>          dev_type = device.get_device_type()
>          if dev_type == NetworkManager.DeviceType.VLAN:
>              self._set_device_info_value("wired", "vlanid", str(device.get_vlan_id()))
> -            parent = nm_device_setting_value(device.get_iface(), "vlan", "parent")
> +            parent = nm.nm_device_setting_value(device.get_iface(), "vlan", "parent")
>              self._set_device_info_value("wired", "parent", parent)
>  
>      def _refresh_speed_hwaddr(self, device, state=None):
> @@ -881,8 +846,6 @@ class NetworkControlBox(object):
>                                              NetworkManager.DeviceState.DEACTIVATING,
>                                              NetworkManager.DeviceState.FAILED))
>              self._updating_device = False
> -            if not configuration_of_disconnected_devices_allowed:
> -                self.builder.get_object("button_%s_options" % dev_type_str).set_sensitive(state == NetworkManager.DeviceState.ACTIVATED)
>          elif dev_type_str == "wireless":
>              self.on_wireless_enabled()
>  
> @@ -1254,7 +1217,7 @@ class NetworkSpoke(FirstbootSpokeMixIn, NormalSpoke):
>      def completed(self):
>          # TODO: check also if source requires updates when implemented
>          return (not can_touch_runtime_system("require network connection")
> -                or nm_activated_devices())
> +                or nm.nm_activated_devices())
>  
>      @property
>      def mandatory(self):
> @@ -1365,7 +1328,7 @@ class NetworkStandaloneSpoke(StandaloneSpoke):
>      @property
>      def completed(self):
>          return (not can_touch_runtime_system("require network connection")
> -                or nm_activated_devices())
> +                or nm.nm_activated_devices())
>  
>      def initialize(self):
>          register_secret_agent(self)
> @@ -1406,7 +1369,7 @@ def _update_network_data(data, ncb):
>          nd = network.ksdata_from_ifcfg(devname)
>          if not nd:
>              continue
> -        if devname in nm_activated_devices():
> +        if devname in nm.nm_activated_devices():
>              nd.activate = True
>          data.network.network.append(nd)
>      hostname = ncb.hostname
This looks good to me.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list