---
storage/__init__.py | 6 +-
storage/devices.py | 137 ++++++++++++++++++++++++-------------------------
storage/devicetree.py | 12 ++--
3 files changed, 77 insertions(+), 78 deletions(-)
diff --git a/storage/__init__.py b/storage/__init__.py
index e5dba78..13f34f9 100644
--- a/storage/__init__.py
+++ b/storage/__init__.py
@@ -1454,20 +1454,20 @@ class FSSet(object):
intf.messageWindow(_("Error"), msg)
sys.exit(0)
- except DeviceError as msg:
+ except DeviceError as (msg, path):
if intf:
if upgrading:
err = _("Error enabling swap device %s: %s\n\n"
"The /etc/fstab on your upgrade partition "
"does not reference a valid swap "
"device.\n\nPress OK to exit the "
- "installer") % (device.path, msg)
+ "installer") % (path, msg)
else:
err = _("Error enabling swap device %s: %s\n\n"
"This most likely means this swap "
"device has not been initialized.\n\n"
"Press OK to exit the installer.") % \
- (device.path, msg)
+ (path, msg)
intf.messageWindow(_("Error"), err)
sys.exit(0)
diff --git a/storage/devices.py b/storage/devices.py
index ea26e8b..6474473 100644
--- a/storage/devices.py
+++ b/storage/devices.py
@@ -272,7 +272,7 @@ class Device(object):
log.info("NOTE: recursive device creation disabled")
for parent in self.parents:
if not parent.exists:
- raise DeviceError("parent device does not exist")
+ raise DeviceError("parent device does not exist", self.path)
#parent.create()
def dependsOn(self, dep):
@@ -523,7 +523,7 @@ class StorageDevice(Device):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
self.setupParents()
for parent in self.parents:
@@ -533,7 +533,7 @@ class StorageDevice(Device):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists and not recursive:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status and self.format.exists:
self.format.teardown()
@@ -560,7 +560,7 @@ class StorageDevice(Device):
""" Set the device's size to a new value. """
if newsize> self.maxSize:
raise DeviceError("device cannot be larger than %s MB" %
- (self.maxSize(),))
+ (self.maxSize(),), self.path)
self._size = newsize
size = property(lambda x: x._getSize(),
@@ -613,7 +613,7 @@ class StorageDevice(Device):
current=getattr(self._format, "type", None))
if self._format and self._format.status:
# FIXME: self.format.status doesn't mean much
- raise DeviceError("cannot replace active format")
+ raise DeviceError("cannot replace active format", self.path)
self._format = format
@@ -628,7 +628,7 @@ class StorageDevice(Device):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device has already been created")
+ raise DeviceError("device has already been created", self.path)
self.createParents()
self.setupParents()
@@ -639,10 +639,10 @@ class StorageDevice(Device):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if not self.isleaf:
- raise DeviceError("Cannot destroy non-leaf device")
+ raise DeviceError("Cannot destroy non-leaf device", self.path)
self.exists = False
# we already did this in DeviceTree._removeDevice
@@ -753,7 +753,7 @@ class DiskDevice(StorageDevice):
def removePartition(self, device):
log_method_call(self, self.name, part=device.name)
if not self.mediaPresent:
- raise DeviceError("cannot remove partition from disk %s which has no media" % self.name)
+ raise DeviceError("cannot remove partition from disk %s which has no media" % self.name, self.path)
partition = self.partedDisk.getPartitionByPath(device.path)
if partition:
@@ -762,7 +762,7 @@ class DiskDevice(StorageDevice):
def addPartition(self, device):
log_method_call(self, self.name, part=device.name)
if not self.mediaPresent:
- raise DeviceError("cannot add partition to disk %s which has no media" % self.name)
+ raise DeviceError("cannot add partition to disk with no media", self.path)
for part in self.partedDisk.partitions:
log.debug("disk %s: partition %s has geom %s" % (self.name,
@@ -793,7 +793,7 @@ class DiskDevice(StorageDevice):
""" Commit changes to the device. """
log_method_call(self, self.name, status=self.status)
if not self.mediaPresent:
- raise DeviceError("cannot commit to disk %s which has no media" % self.name)
+ raise DeviceError("cannot commit to disk with no media", self.path)
self.setupParents()
self.setup()
@@ -812,7 +812,7 @@ class DiskDevice(StorageDevice):
attempt += 1
if keepTrying:
- raise DeviceError("cannot commit to disk %s after %d attempts" % (self.name, maxTries,))
+ raise DeviceError("cannot commit to disk after %d attempts" % (maxTries,), self.path)
# commit makes the kernel re-scan the partition table
udev_settle()
@@ -821,7 +821,7 @@ class DiskDevice(StorageDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.mediaPresent:
- raise DeviceError("cannot destroy disk %s which has no media" % self.name)
+ raise DeviceError("cannot destroy disk with no media", self.path)
self.partedDisk.deleteAllPartitions()
# this is perhaps a separate operation (wiping the disklabel)
@@ -834,7 +834,7 @@ class DiskDevice(StorageDevice):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not os.path.exists(self.path):
- raise DeviceError("device does not exist")
+ raise DeviceError("device does not exist", self.path)
class PartitionDevice(StorageDevice):
@@ -921,7 +921,7 @@ class PartitionDevice(StorageDevice):
#self.partedPartition = parted.getPartitionByName(self.path)
self._partedPartition = self.disk.partedDisk.getPartitionByPath(self.path)
if not self._partedPartition:
- raise DeviceError("cannot find parted partition instance")
+ raise DeviceError("cannot find parted partition instance", self.path)
# collect information about the partition from parted
self.probe()
@@ -1084,8 +1084,7 @@ class PartitionDevice(StorageDevice):
else:
self.unsetFlag(parted.PARTITION_BOOT)
else:
- raise DeviceError(_("boot flag not available for this "
- "partition"))
+ raise DeviceError("boot flag not available for this partition", self.path)
self._bootable = bootable
else:
@@ -1149,7 +1148,7 @@ class PartitionDevice(StorageDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
self.createParents()
self.setupParents()
@@ -1206,13 +1205,13 @@ class PartitionDevice(StorageDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if not self.sysfsPath:
return
if not self.isleaf:
- raise DeviceError("Cannot destroy non-leaf device")
+ raise DeviceError("Cannot destroy non-leaf device", self.path)
self.setupParents()
self.disk.removePartition(self)
@@ -1239,7 +1238,7 @@ class PartitionDevice(StorageDevice):
log_method_call(self, self.name,
status=self.status, size=self._size, newsize=newsize)
if not self.exists:
- raise DeviceError("device does not exist")
+ raise DeviceError("device does not exist", self.path)
if newsize> self.disk.size:
raise ValueError("partition size would exceed disk size")
@@ -1339,7 +1338,7 @@ class DMDevice(StorageDevice):
""" Update this device's sysfs path. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
dm_node = self.getDMNode()
@@ -1355,7 +1354,7 @@ class DMDevice(StorageDevice):
""" Return the dm-X (eg: dm-0) device node for this device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
return dm.dm_node_from_name(self.name)
@@ -1363,7 +1362,7 @@ class DMDevice(StorageDevice):
""" Set the device's map name. """
log_method_call(self, self.name, status=self.status)
if self.status:
- raise DeviceError("device is active")
+ raise DeviceError("cannot rename active device", self.path)
self._name = name
#self.sysfsPath = "/dev/disk/by-id/dm-name-%s" % self.name
@@ -1434,7 +1433,7 @@ class LUKSDevice(DMCryptDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
self.createParents()
self.setupParents()
@@ -1449,7 +1448,7 @@ class LUKSDevice(DMCryptDevice):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
self.slave.setup()
self.slave.format.setup()
@@ -1462,7 +1461,7 @@ class LUKSDevice(DMCryptDevice):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists and not recursive:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status and self.format.exists:
self.format.teardown()
@@ -1524,7 +1523,7 @@ class LVMVolumeGroupDevice(DMDevice):
"""
self.pvClass = get_device_format_class("lvmpv")
if not self.pvClass:
- raise DeviceError("cannot find 'lvmpv' class")
+ raise StorageError("cannot find 'lvmpv' class")
if isinstance(parents, list):
for dev in parents:
@@ -1573,7 +1572,7 @@ class LVMVolumeGroupDevice(DMDevice):
""" Probe for any information about this device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
@property
def path(self):
@@ -1586,7 +1585,7 @@ class LVMVolumeGroupDevice(DMDevice):
# Thank you lvm for this lovely hack.
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
return dm.dm_node_from_name(self.name.replace("-","--"))
@@ -1623,7 +1622,7 @@ class LVMVolumeGroupDevice(DMDevice):
device=device.name,
status=self.status)
if not self.exists:
- raise DeviceError("device does not exist")
+ raise DeviceError("device does not exist", self.path)
if not isinstance(device.format, self.pvClass):
raise ValueError("addDevice requires a PV arg")
@@ -1665,13 +1664,13 @@ class LVMVolumeGroupDevice(DMDevice):
"""
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
return
if len(self.parents)< self.pvCount:
- raise DeviceError("cannot activate VG with missing PV(s)")
+ raise DeviceError("cannot activate VG with missing PV(s)", self.path)
self.setupParents()
@@ -1679,7 +1678,7 @@ class LVMVolumeGroupDevice(DMDevice):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists and not recursive:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
lvm.vgdeactivate(self.name)
@@ -1691,7 +1690,7 @@ class LVMVolumeGroupDevice(DMDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
pv_list = []
#for pv in self.parents:
@@ -1713,7 +1712,7 @@ class LVMVolumeGroupDevice(DMDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
# set up the pvs since lvm needs access to them to do the vgremove
self.setupParents()
@@ -1723,7 +1722,7 @@ class LVMVolumeGroupDevice(DMDevice):
lvm.vgreduce(self.name, [], rm=True)
lvm.vgremove(self.name)
except lvm.LVMError:
- raise DeviceError("Could not completely remove VG %s" % self.name)
+ raise DeviceError("Could not completely remove VG", self.path)
finally:
self.notifyKernel()
self.exists = False
@@ -1732,7 +1731,7 @@ class LVMVolumeGroupDevice(DMDevice):
""" Remove the listed PVs from the VG. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
lvm.vgreduce(self.name, pv_list)
# XXX do we need to notify the kernel?
@@ -1747,7 +1746,7 @@ class LVMVolumeGroupDevice(DMDevice):
if not lv.exists and \
not [pv for pv in self.pvs if getattr(pv, "req_grow", None)] and \
lv.size> self.freeSpace:
- raise DeviceError("new lv is too large to fit in free space")
+ raise DeviceError("new lv is too large to fit in free space", self.path)
self._lvs.append(lv)
@@ -1765,7 +1764,7 @@ class LVMVolumeGroupDevice(DMDevice):
# for the time being we will not allow vgextend
if self.exists:
- raise DeviceError("cannot add pv to existing vg")
+ raise DeviceError("cannot add pv to existing vg", self.path)
self.parents.append(pv)
pv.addChild()
@@ -1777,7 +1776,7 @@ class LVMVolumeGroupDevice(DMDevice):
# for the time being we will not allow vgreduce
if self.exists:
- raise DeviceError("cannot remove pv from existing vg")
+ raise DeviceError("cannot remove pv from existing vg", self.path)
self.parents.remove(pv)
pv.removeChild()
@@ -1964,7 +1963,7 @@ class LVMLogicalVolumeDevice(DMDevice):
# Thank you lvm for this lovely hack.
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
return dm.dm_node_from_name("%s-%s" % (self.vg.name.replace("-","--"), \
self._name.replace("-","--")))
@@ -1988,7 +1987,7 @@ class LVMLogicalVolumeDevice(DMDevice):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
return
@@ -2004,7 +2003,7 @@ class LVMLogicalVolumeDevice(DMDevice):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists and not recursive:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status and self.format.exists:
self.format.teardown()
@@ -2026,7 +2025,7 @@ class LVMLogicalVolumeDevice(DMDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
self.createParents()
self.setupParents()
@@ -2041,7 +2040,7 @@ class LVMLogicalVolumeDevice(DMDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
self.teardown()
# set up the vg's pvs so lvm can remove the lv
@@ -2053,7 +2052,7 @@ class LVMLogicalVolumeDevice(DMDevice):
# XXX resize format probably, right?
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
# Setup VG parents (in case they are dmraid partitions for example)
self.vg.setupParents()
@@ -2116,7 +2115,7 @@ class MDRaidArrayDevice(StorageDevice):
self.formatClass = get_device_format_class("mdmember")
if not self.formatClass:
- raise DeviceError("cannot find class for 'mdmember'")
+ raise DeviceError("cannot find class for 'mdmember'", self.path)
if self.exists and self.uuid:
# this is a hack to work around mdadm's insistence on giving
@@ -2172,7 +2171,7 @@ class MDRaidArrayDevice(StorageDevice):
def mdadmConfEntry(self):
""" This array's mdadm.conf entry. """
if self.level is None or self.memberDevices is None or not self.uuid:
- raise DeviceError("array is not fully defined")
+ raise DeviceError("array is not fully defined", self.path)
fmt = "ARRAY level=raid%d num-devices=%d UUID=%s\n"
return fmt % (self.level, self.memberDevices, self.uuid)
@@ -2224,7 +2223,7 @@ class MDRaidArrayDevice(StorageDevice):
"""
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
try:
self.devices[0].setup()
@@ -2243,7 +2242,7 @@ class MDRaidArrayDevice(StorageDevice):
""" Update this device's sysfs path. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
self.sysfsPath = "/devices/virtual/block/%s" % self.name
@@ -2261,7 +2260,7 @@ class MDRaidArrayDevice(StorageDevice):
device=device.name,
status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if not isinstance(device.format, self.formatClass):
raise ValueError("invalid device format for mdraid member")
@@ -2349,7 +2348,7 @@ class MDRaidArrayDevice(StorageDevice):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
return
@@ -2374,7 +2373,7 @@ class MDRaidArrayDevice(StorageDevice):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists and not recursive:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status and self.format.exists:
self.format.teardown()
@@ -2390,7 +2389,7 @@ class MDRaidArrayDevice(StorageDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
disks = [disk.path for disk in self.devices]
self.createParents()
@@ -2423,7 +2422,7 @@ class MDRaidArrayDevice(StorageDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
self.teardown()
@@ -2469,7 +2468,7 @@ class DMRaidArrayDevice(DiskDevice):
self.formatClass = get_device_format_class("dmraidmember")
if not self.formatClass:
- raise DeviceError("cannot find class for 'dmraidmember'")
+ raise StorageError("cannot find class for 'dmraidmember'")
self._raidSet = raidSet
@@ -2487,7 +2486,7 @@ class DMRaidArrayDevice(DiskDevice):
log_method_call(self, self.name, device=device.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if not isinstance(device.format, self.formatClass):
raise ValueError("invalid device format for dmraid member")
@@ -2512,7 +2511,7 @@ class DMRaidArrayDevice(DiskDevice):
""" Update this device's sysfs path. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.status:
dm_node = dm.dm_node_from_name(self.name)
@@ -2525,7 +2524,7 @@ class DMRaidArrayDevice(DiskDevice):
""" Close, or tear down, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
if self.format.exists:
self.format.teardown()
@@ -2538,7 +2537,7 @@ class DMRaidArrayDevice(DiskDevice):
""" Open, or set up, a device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
# This call already checks if the set is active.
self._raidSet.activate(mknod=True)
@@ -2689,7 +2688,7 @@ class FileDevice(StorageDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
# this only checks that parents exist
self.createParents()
@@ -2698,7 +2697,7 @@ class FileDevice(StorageDevice):
try:
fd = os.open(self.path, os.O_RDWR)
except OSError as e:
- raise DeviceError(e)
+ raise DeviceError(e, self.path)
try:
buf = '\0' * 1024 * 1024 * self.size
@@ -2714,7 +2713,7 @@ class FileDevice(StorageDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
os.unlink(self.path)
self.exists = False
@@ -2731,14 +2730,14 @@ class DirectoryDevice(FileDevice):
""" Create the device. """
log_method_call(self, self.name, status=self.status)
if self.exists:
- raise DeviceError("device already exists")
+ raise DeviceError("device already exists", self.path)
self.createParents()
self.setupParents()
try:
iutil.mkdirChain(self.path)
except Exception, e:
- raise DeviceError, e
+ raise DeviceError(e, self.path)
self.exists = True
@@ -2746,7 +2745,7 @@ class DirectoryDevice(FileDevice):
""" Destroy the device. """
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
os.unlink(self.path)
self.exists = False
@@ -2786,7 +2785,7 @@ class OpticalDevice(StorageDevice):
"""
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
try:
fd = os.open(self.path, os.O_RDONLY)
@@ -2806,7 +2805,7 @@ class OpticalDevice(StorageDevice):
log_method_call(self, self.name, status=self.status)
if not self.exists:
- raise DeviceError("device has not been created")
+ raise DeviceError("device has not been created", self.path)
# Make a best effort attempt to do the eject. If it fails, it's not
# critical.
diff --git a/storage/devicetree.py b/storage/devicetree.py
index 13dd0fb..996e702 100644
--- a/storage/devicetree.py
+++ b/storage/devicetree.py
@@ -1214,8 +1214,8 @@ class DeviceTree(object):
for lv in vg_device.lvs:
try:
lv.setup()
- except DeviceError as e:
- log.info("setup of %s failed: %s" % (lv.name, e))
+ except DeviceError as (msg, path):
+ log.info("setup of %s failed: %s" % (lv.name, msg))
else:
try:
vg_uuid = udev_device_get_vg_uuid(info)
@@ -1269,9 +1269,9 @@ class DeviceTree(object):
try:
lv_device.setup()
- except DeviceError as e:
+ except DeviceError as (msg, path):
log.info("setup of %s failed: %s"
- % (lv_device.name, e))
+ % (lv_device.name, msg))
def handleUdevMDMemberFormat(self, info, device):
log_method_call(self, name=device.name, type=device.format.type)
@@ -1649,8 +1649,8 @@ class DeviceTree(object):
for device in self.leaves:
try:
device.setup()
- except DeviceError as e:
- log.debug("setup of %s failed: %s" % (device.name, e))
+ except DeviceError as (msg, path):
+ log.debug("setup of %s failed: %s" % (device.name, msg))
def getDeviceBySysfsPath(self, path):
found = None