summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lehman <dlehman@redhat.com>2008-02-01 12:44:06 -0600
committerDavid Lehman <dlehman@redhat.com>2008-02-05 10:41:23 -0600
commite58179bde1d75c8636329d2f08fc8531683e7ab3 (patch)
treedc29c1b361ab9e97a56606376073b013da8daabf
parente5469fa9215346a2157ce334f0185ad18e4ca9db (diff)
downloadanaconda-e58179bde1d75c8636329d2f08fc8531683e7ab3.tar.gz
anaconda-e58179bde1d75c8636329d2f08fc8531683e7ab3.tar.xz
anaconda-e58179bde1d75c8636329d2f08fc8531683e7ab3.zip
Add ability to scan encrypted devices for fstype, labels, and root filesystems.
-rw-r--r--partedUtils.py91
1 files changed, 73 insertions, 18 deletions
diff --git a/partedUtils.py b/partedUtils.py
index f047a2fca..716602761 100644
--- a/partedUtils.py
+++ b/partedUtils.py
@@ -680,10 +680,17 @@ class DiskSet:
parts = filter_partitions(disk, func)
for part in parts:
node = get_partition_name(part)
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(node)
+ if crypto and not crypto.openDevice():
+ node = crypto.getDevice()
+
label = isys.readFSLabel(node)
if label:
labels[node] = label
+ if crypto:
+ crypto.closeDevice()
+
# not doing this right now, because we should _always_ have a
# partition table of some kind on dmraid.
if False:
@@ -693,10 +700,17 @@ class DiskSet:
labels[rs.name] = label
for dev, devices, level, numActive in DiskSet.mdList:
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(dev)
+ if crypto and not crypto.openDevice():
+ dev = crypto.getDevice()
+
label = isys.readFSLabel(dev)
if label:
labels[dev] = label
+ if crypto:
+ crypto.closeDevice()
+
active = lvm.vgcheckactive()
if not active:
lvm.vgscan()
@@ -706,10 +720,17 @@ class DiskSet:
if lvorigin:
continue
node = "%s/%s" % (vg, lv)
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(node)
+ if crypto and not crypto.openDevice():
+ node = crypto.getDevice()
+
label = isys.readFSLabel("/dev/" + node)
if label:
labels[node] = label
+ if crypto:
+ crypto.closeDevice()
+
if not active:
lvm.vgdeactivate()
@@ -723,16 +744,28 @@ class DiskSet:
self.startDmRaid()
self.startMdRaid()
+ for dev, crypto in self.anaconda.id.partitions.encryptedDevices.items():
+ # FIXME: order these so LVM and RAID always work on the first try
+ if crypto.openDevice():
+ log.error("failed to open encrypted device %s" % (dev,))
+
if flags.cmdline.has_key("upgradeany"):
upgradeany = 1
for dev, devices, level, numActive in self.mdList:
(errno, msg) = (None, None)
found = 0
- fs = isys.readFSType(dev)
+ theDev = dev
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(dev)
+ if crypto and not crypto.openDevice():
+ theDev = "/dev/%s" % (crypto.getDevice(),)
+ elif crypto:
+ log.error("failed to open encrypted device %s" % dev)
+
+ fs = isys.readFSType(theDev)
if fs is not None:
try:
- isys.mount(dev, self.anaconda.rootPath, fs, readOnly = 1)
+ isys.mount(theDev, self.anaconda.rootPath, fs, readOnly = 1)
found = 1
except SystemError, (errno, msg):
pass
@@ -744,11 +777,12 @@ class DiskSet:
if ((upgradeany == 1) or
(productMatches(relstr, productName))):
try:
- label = isys.readFSLabel(dev)
+ label = isys.readFSLabel(theDev)
except:
label = None
- rootparts.append ((dev, fs, relstr, label))
+ # XXX we could add the "raw" dev and let caller decrypt
+ rootparts.append ((theDev, fs, relstr, label))
isys.umount(self.anaconda.rootPath)
# now, look for candidate lvm roots
@@ -760,10 +794,18 @@ class DiskSet:
continue
dev = "/dev/%s/%s" %(vg, lv)
found = 0
- fs = isys.readFSType(dev)
+ theDev = dev
+ node = "%s/%s" % (vg, lv)
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(node)
+ if crypto and not crypto.openDevice():
+ theDev = "/dev/%s" % (crypto.getDevice(),)
+ elif crypto:
+ log.error("failed to open encrypted device %s" % dev)
+
+ fs = isys.readFSType(theDev)
if fs is not None:
try:
- isys.mount(dev, self.anaconda.rootPath, fs, readOnly = 1)
+ isys.mount(theDev, self.anaconda.rootPath, fs, readOnly = 1)
found = 1
except SystemError:
pass
@@ -775,11 +817,11 @@ class DiskSet:
if ((upgradeany == 1) or
(productMatches(relstr, productName))):
try:
- label = isys.readFSLabel(dev)
+ label = isys.readFSLabel(theDev)
except:
label = None
- rootparts.append ((dev, fs, relstr, label))
+ rootparts.append ((theDev, fs, relstr, label))
isys.umount(self.anaconda.rootPath)
lvm.vgdeactivate()
@@ -796,20 +838,34 @@ class DiskSet:
disk = self.disks[drive]
part = disk.next_partition ()
while part:
+ node = get_partition_name(part)
+ crypto = self.anaconda.id.partitions.encryptedDevices.get(node)
if (part.is_active()
and (part.get_flag(parted.PARTITION_RAID)
or part.get_flag(parted.PARTITION_LVM))):
- pass
- elif (part.fs_type and
- part.fs_type.name in fsset.getUsableLinuxFs()):
- node = get_partition_name(part)
+ part = disk.next_partition(part)
+ continue
+ elif part.fs_type or crypto:
+ theDev = node
+ if part.fs_type:
+ fstype = part.fs_type.name
+
+ if crypto and not crypto.openDevice():
+ theDev = crypto.getDevice()
+ fstype = isys.readFSType("/dev/%s" % theDev)
+ elif crypto:
+ log.error("failed to open encrypted device %s" % node)
+
+ if not fstype or fstype not in fsset.getUsableLinuxFs():
+ part = disk.next_partition(part)
+ continue
# The root filesystem can be on the same partition as the
# ISO images, but we don't want to try to remount it
# because that'll throw up a useless error message.
- if not protected or node not in protected:
+ if not protected or theDev not in protected:
try:
- isys.mount(node, self.anaconda.rootPath, part.fs_type.name)
+ isys.mount(theDev, self.anaconda.rootPath, part.fs_type.name)
checkRoot = self.anaconda.rootPath
except SystemError, (errno, msg):
part = disk.next_partition(part)
@@ -817,18 +873,17 @@ class DiskSet:
else:
checkRoot = self.anaconda.method.isoDir
- if os.access (checkRoot + '/etc/fstab', os.R_OK):
+ if os.access (checkRoot + '/etc/fstab', os.R_OK):
relstr = getReleaseString(checkRoot)
if ((upgradeany == 1) or
(productMatches(relstr, productName))):
try:
- label = isys.readFSLabel("/dev/%s" % node)
+ label = isys.readFSLabel("/dev/%s" % theDev)
except:
label = None
- rootparts.append ((node, part.fs_type.name,
- relstr, label))
+ rootparts.append ((theDev, fstype, relstr, label))
if not protected or node not in protected:
isys.umount(self.anaconda.rootPath)