+ def enumerateBlockDevices(self):
+ print "enumerating block devices..."
+ import os
+ for blockdev in os.listdir("/sys/block"):
+ devpath = "/sys/block/" + blockdev
+ error = False
+ removable = False
+ blacklisted = False
+ is_cdrom = False
+ partitions = []
+ try:
+ removable = bool(int(open(devpath + "/removable").read()))
+ dev = int(open(devpath + "/dev").read().split(':')[0])
+ if dev in [7, 31]: # loop, mtdblock
+ blacklisted = True
+ if blockdev[0:2] == 'sr':
+ is_cdrom = True
+ if blockdev[0:2] == 'hd':
+ try:
+ media = open("/proc/ide/%s/media" % blockdev).read()
+ if media.find("cdrom") != -1:
+ is_cdrom = True
+ except IOError:
+ error = True
+ # check for partitions
+ if not is_cdrom:
+ for partition in os.listdir(devpath):
+ if partition[0:len(blockdev)] != blockdev:
+ continue
+ partitions.append(partition)
+ except IOError:
+ error = True
+ print "found block device '%s':" % blockdev,
+ if error:
+ print "error querying properties"
+ elif blacklisted:
+ print "blacklisted"
+ else:
+ print "ok, removable=%s, cdrom=%s, partitions=%s" % (removable, is_cdrom, partitions)
+ self.addHotplugPartition(blockdev, blockdev)
+ for part in partitions:
+ self.addHotplugPartition(part, part)
+
+ def getAutofsMountpoint(self, device):
+ return "/autofs/%s/" % (device)
+
+ def addHotplugPartition(self, device, description):
+ p = Partition(mountpoint = self.getAutofsMountpoint(device), description = description, force_mounted = True)
+ self.partitions.append(p)
+ self.on_partition_list_change("add", p)
+
+ def removeHotplugPartition(self, device):
+ mountpoint = self.getAutofsMountpoint(device)
+ for x in self.partitions[:]:
+ if x.mountpoint == mountpoint:
+ self.partitions.remove(x)
+ self.on_partition_list_change("remove", x)
+