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

[PATCH 11/15] Use HAL to probe for disks. Add a removableDriveDict for use by the exception dialog.



---
 isys/isys.py |   68 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 41 insertions(+), 27 deletions(-)

diff --git a/isys/isys.py b/isys/isys.py
index 663bc1b..0d04443 100755
--- a/isys/isys.py
+++ b/isys/isys.py
@@ -367,11 +367,6 @@ def swapon (path):
 def loadKeymap(keymap):
     return _isys.loadKeymap (keymap)
 
-classMap = { "disk": kudzu.CLASS_HD,
-             "cdrom": kudzu.CLASS_CDROM,
-             "floppy": kudzu.CLASS_FLOPPY,
-             "tape": kudzu.CLASS_TAPE }
-
 cachedDrives = None
 
 ## Clear the drive dict cache.
@@ -388,32 +383,42 @@ def driveDict(klassArg):
     import parted
     global cachedDrives
     if cachedDrives is None:
-        # FIXME: need to add dasd probing to kudzu
-        devs = kudzu.probe(kudzu.CLASS_HD | kudzu.CLASS_CDROM | \
-                           kudzu.CLASS_FLOPPY | kudzu.CLASS_TAPE,
-                           kudzu.BUS_UNSPEC, kudzu.PROBE_SAFE)
+        import dbus
+
+        bus = dbus.SystemBus()
+
+        halobj = bus.get_object("org.freedesktop.Hal","/org/freedesktop/Hal/Manager")
+        hal = dbus.Interface(halobj, "org.freedesktop.Hal.Manager")
+
         new = {}
-        for dev in devs:
-            device = dev.device
-            if device is None: # none devices make no sense
-                # kudzu is unable to determine the device for tape drives w/ 2.6
-                if dev.deviceclass == classMap["tape"]:
-                    tapedevs = filter(lambda d: d.startswith("st"), new.keys())
-                    device = "st%d" % (len(tapedevs),)
-                else:
+        for udi in halobj.FindDeviceByCapability("storage"):
+            haldev = dbus.Interface(bus.get_object("org.freedesktop.Hal", udi), 'org.freedesktop.Hal.Device')
+            try:
+                device = haldev.GetProperty('block.device')
+                device = device.replace('/dev/','')
+            except:
+                try:
+                    device = haldev.GetProperty('linux.device_file')
+                    device = device.replace('/dev/','')
+                except:
                     continue
 
+            dev = {}
+            dev['device'] = device
+            dev['class'] = haldev.GetProperty('storage.drive_type')
+            dev['removable'] = haldev.GetProperty('storage.removable')
+            dev['desc'] = '%s %s' % (haldev.GetProperty('storage.vendor'), haldev.GetProperty('storage.model'))
+
             # we can't actually use the sg devices, so ignore them
             if device.startswith("sg"):
                 log.info("ignoring sg device %s" %(device,))
                 continue
 
-            if dev.deviceclass != classMap["disk"]:
+            if dev['class'] != "disk":
                 new[device] = dev
                 continue
             try:
                 devName = "/dev/%s" % (device,)
-                makeDevInode(device, devName)
 
                 if not mediaPresent (device):
                     new[device] = dev
@@ -477,8 +482,8 @@ def driveDict(klassArg):
         if isinstance(dev, block.MultiPath) or isinstance(dev, block.RaidSet):
             if klassArg == "disk":
                 ret[key] = dev
-        elif dev.deviceclass == classMap[klassArg]:
-            ret[key] = dev.desc
+        elif dev['class'] == klassArg:
+            ret[key] = dev
     return ret
 
 ## Get all the hard drives attached to the system.
@@ -490,18 +495,27 @@ def driveDict(klassArg):
 # @see driveDict
 # @return A dict of all the hard drive descriptions, keyed on device name.
 def hardDriveDict():
-    return driveDict("disk")
+    ret = {}
+    dict = driveDict("disk")
+    for item in dict.keys():
+        ret[item] = dict[item]['desc']
+    return ret
 
-## Get all the floppy drives attached to the system.
-# This method queries the drive dict cache for all floppy drives.  If the cache
+## Get all the removable drives attached to the system.
+# This method queries the drive dict cache for all removable drives.  If the cache
 # is empty, this will cause all disk devices to be probed.  If the status of
 # the devices has changed, flushDriveDict must be run called first.
 #
 # @see flushDriveDict
 # @see driveDict
-# @return A dict of all the floppy drive descriptions, keyed on device name.
-def floppyDriveDict():
-    return driveDict("floppy")
+# @return A dict of all the removable drive descriptions, keyed on device name.
+def removableDriveDict():
+    ret = {}
+    dict = driveDict("disk")
+    for item in dict.keys():
+        if dict[item]['removable'] != 0:
+            ret[item] = dict[item]['desc']
+    return ret
 
 ## Get all CD/DVD drives attached to the system.
 # This method queries the drive dict cache for all hard drives.  If the cache
-- 
1.5.3.4


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