[PATCH 16/22] Add support for wireless configuration using nm-c-e in stage 2 (#473803)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 gui.py            |   18 ++++++++++++++-
 iw/network_gui.py |   56 ++++++++++++++++++++++++++++++++++++++++++++++++
 network.py        |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 134 insertions(+), 1 deletions(-)

diff --git a/gui.py b/gui.py
index 1008d93..50c542f 100755
--- a/gui.py
+++ b/gui.py
@@ -962,7 +962,8 @@ class InstallInterface(InstallInterfaceBase):
             return False
 
         from network_gui import (runNMCE,
-                                 selectNetDevicesDialog)
+                                 selectNetDevicesDialog,
+                                 selectSSIDsDialog)
 
         networkEnabled = False
         while not networkEnabled:
@@ -981,6 +982,21 @@ class InstallInterface(InstallInterfaceBase):
             if not just_setup:
                 self.anaconda.network.updateActiveDevices([install_device])
 
+            # we might want to do this only once
+            # NOTE: For wireless, we need supplicant to go to ready state,
+            #       that means to get the wireless device managed by NM
+            #       - we do it above in setNMControlledDevices.
+            # TODORV: put into Network objects
+            if network.hasWirelessDev():
+                w = self.anaconda.intf.waitWindow(_("Wireless setup"),
+                                    _("Scanning access points for wireless devices"))
+                # get available wireless APs
+                dev_all_ssids = self.anaconda.network.getSSIDs()
+                w.pop()
+                # select wireless APs
+                dev_ssids = selectSSIDsDialog(dev_all_ssids) or dev_all_ssids
+                self.anaconda.network.updateIfcfgsSSID(dev_ssids)
+
             network.logIfcfgFiles(header="========== before nm-c-e run\n")
             runNMCE(self.anaconda)
             network.logIfcfgFiles(header="========== after nm-c-e run\n")
diff --git a/iw/network_gui.py b/iw/network_gui.py
index 00cb1d9..0d28d0c 100644
--- a/iw/network_gui.py
+++ b/iw/network_gui.py
@@ -233,5 +233,61 @@ def selectNetDevicesDialog(network, select_install_device=True):
     dialog.destroy()
     return retval
 
+def selectSSIDsDialog(devssids):
+    """Dialog for access point selection.
+
+    devssids - dict iface->[ssid1, ssid2, ssid3, ...]
+    returns  - dict iface->[ssidX] or None on Cancel
+    """
+
+    # If there are no choices, don't ask
+    for dev, ssids in devssids.items():
+        if len(ssids) > 1:
+            break
+    else:
+        return devssids
+
+    rv = {}
+    dialog = gtk.Dialog(_("Select APs"))
+    dialog.add_button('gtk-cancel', 2)
+    dialog.add_button('gtk-ok', 1)
+    dialog.set_position(gtk.WIN_POS_CENTER)
+    gui.addFrame(dialog)
+
+    dialog.vbox.pack_start(gui.WrappingLabel(
+        _("Select APs for wireless devices")))
+
+    table = gtk.Table(len(devssids), 2)
+    table.set_row_spacings(5)
+    table.set_col_spacings(5)
+
+    combos = {}
+    for i, (dev, ssids) in enumerate(devssids.items()):
+
+        label = gtk.Label(dev)
+        table.attach(label, 0, 1, i, i+1, gtk.FILL, gtk.FILL)
+
+        combo = gtk.combo_box_new_text()
+        for ssid in ssids:
+            combo.append_text(ssid)
+        table.attach(combo, 1, 2, i, i+1, gtk.FILL, gtk.FILL)
+        combo.set_active(0)
+        combos[dev] = combo
+
+    dialog.vbox.pack_start(table)
+
+    dialog.show_all()
+
+    rc = dialog.run()
+
+    # cancel
+    if rc in [2, gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
+        rv = None
+    else:
+        for dev, combo in combos.items():
+            rv[dev] = [combo.get_active_text()]
+
+    dialog.destroy()
+    return rv
 
 
diff --git a/network.py b/network.py
index 24f029d..9fc67a1 100644
--- a/network.py
+++ b/network.py
@@ -208,6 +208,15 @@ def hasActiveNetDev():
     except:
         return False
 
+def hasWirelessDev():
+    devprops = isys.getDeviceProperties()
+    for dev, props in devprops.items():
+        device_type = int(props.Get(isys.NM_MANAGER_IFACE, "DeviceType"))
+        if device_type == 2:
+            return True
+    return False
+
+
 # Return a list of device names (e.g., eth0) for all active devices.
 # Returning a list here even though we will almost always have one
 # device.  NM uses lists throughout its D-Bus communication, so trying
@@ -462,6 +471,16 @@ class Network:
                 ifaces.append(iface)
         return ifaces
 
+    def updateIfcfgsSSID(self, devssids):
+        for devname, device in self.netdevices.items():
+            if devname in devssids.keys():
+                device.set(('ESSID', devssids[devname][0]))
+                device.writeIfcfgFile()
+                device.log_file("updateIfcfgSSID\n")
+
+    def getSSIDs(self):
+        return getSSIDs(self.netdevices.keys())
+
     def writeKS(self, f):
         devNames = self.netdevices.keys()
         devNames.sort()
@@ -803,3 +822,45 @@ class Network:
                 netargs += ",%s" % (','.join(options))
 
         return netargs
+
+def getSSIDs(devices_to_scan=None):
+
+    rv = {}
+    bus = dbus.SystemBus()
+    nm = bus.get_object(isys.NM_SERVICE, isys.NM_MANAGER_PATH)
+    device_paths = nm.get_dbus_method("GetDevices")()
+
+    for device_path in device_paths:
+
+        device = bus.get_object(isys.NM_SERVICE, device_path)
+        device_props_iface = dbus.Interface(device, isys.DBUS_PROPS_IFACE)
+        # interface name, eg. "eth0", "wlan0"
+        dev = str(device_props_iface.Get(isys.NM_MANAGER_IFACE, "Interface"))
+
+        if (isys.isWireless(dev) and
+            (not devices_to_scan or dev in devices_to_scan)):
+
+            i = 0
+            log.info("scanning APs for %s" % dev)
+            while i < 5:
+                ap_paths = device.GetAccessPoints(dbus_interface='org.freedesktop.NetworkManager.Device.Wireless')
+                if ap_paths:
+                    break
+                time.sleep(0.5)
+                i += 0.5
+
+            ssids = []
+            for ap_path in ap_paths:
+                ap = bus.get_object(isys.NM_SERVICE, ap_path)
+                ap_props = dbus.Interface(ap, isys.DBUS_PROPS_IFACE)
+                ssid_bytearray = ap_props.Get(isys.NM_MANAGER_IFACE, "Ssid")
+                ssid = "".join((str(b) for b in ssid_bytearray))
+                ssids.append(ssid)
+            log.info("APs found for %s: %s" % (dev, str(ssids)))
+            # XXX there can be duplicates in a list, but maybe
+            # we want to keep them when/if we differentiate on something
+            # more then just ssids; for now, remove them
+            rv[dev]=list(set(ssids))
+
+    return rv
+
-- 
1.6.0.6

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux