[pykickstart][PATCH] Add cipher option for encrypting block devices.
David Lehman
dlehman at redhat.com
Fri Oct 12 19:54:58 UTC 2012
(based on commit 4946bcf5d330338a160c12e77f3252fce60994d4
from rhel6-branch)
Also update some RHEL6 stuff that didn't make it to master.
---
pykickstart/commands/autopart.py | 50 ++++++++++++++++++++++++++++++++++++-
pykickstart/commands/logvol.py | 37 ++++++++++++++++++++++++++++
pykickstart/commands/partition.py | 36 +++++++++++++++++++++++++++
pykickstart/commands/raid.py | 52 +++++++++++++++++++++++++++++++++++++++
pykickstart/handlers/control.py | 22 ++++++++---------
tests/commands/autopart.py | 27 ++++++++++++++++++++
tests/commands/logvol.py | 27 ++++++++++++++++++++
tests/commands/partition.py | 25 +++++++++++++++++++
tests/commands/raid.py | 26 ++++++++++++++++++++
9 files changed, 290 insertions(+), 12 deletions(-)
diff --git a/pykickstart/commands/autopart.py b/pykickstart/commands/autopart.py
index 910886f..a00efdb 100644
--- a/pykickstart/commands/autopart.py
+++ b/pykickstart/commands/autopart.py
@@ -1,7 +1,7 @@
#
# Chris Lumens <clumens at redhat.com>
#
-# Copyright 2005, 2006, 2007, 2008 Red Hat, Inc.
+# Copyright 2005, 2006, 2007, 2008, 2012 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use, modify,
# copy, or redistribute it subject to the terms and conditions of the GNU
@@ -120,6 +120,30 @@ class F12_AutoPart(F9_AutoPart):
op.add_option("--backuppassphrase", action="store_true", default=False)
return op
+class RHEL6_AutoPart(F12_AutoPart):
+ removedKeywords = F12_AutoPart.removedKeywords
+ removedAttrs = F12_AutoPart.removedAttrs
+
+ def __init__(self, writePriority=100, *args, **kwargs):
+ F12_AutoPart.__init__(self, writePriority=writePriority, *args, **kwargs)
+ self.cipher = kwargs.get("cipher", "")
+
+ def __str__(self):
+ retval = F12_AutoPart.__str__(self)
+
+ if self.encrypted and self.cipher:
+ # remove any trailing newline
+ retval = retval.strip()
+ retval += " --cipher=\"%s\"" % self.cipher
+ retval += "\n"
+
+ return retval
+
+ def _getParser(self):
+ op = F12_AutoPart._getParser(self)
+ op.add_option("--cipher")
+ return op
+
class F16_AutoPart(F12_AutoPart):
removedKeywords = F12_AutoPart.removedKeywords
removedAttrs = F12_AutoPart.removedAttrs
@@ -199,3 +223,27 @@ class F17_AutoPart(F16_AutoPart):
self.lvm = True
return self
+
+class F18_AutoPart(F17_AutoPart):
+ removedKeywords = F17_AutoPart.removedKeywords
+ removedAttrs = F17_AutoPart.removedAttrs
+
+ def __init__(self, writePriority=100, *args, **kwargs):
+ F17_AutoPart.__init__(self, writePriority=writePriority, *args, **kwargs)
+ self.cipher = kwargs.get("cipher", "")
+
+ def __str__(self):
+ retval = F17_AutoPart.__str__(self)
+
+ if self.encrypted and self.cipher:
+ # remove any trailing newline
+ retval = retval.strip()
+ retval += " --cipher=\"%s\"" % self.cipher
+ retval += "\n"
+
+ return retval
+
+ def _getParser(self):
+ op = F17_AutoPart._getParser(self)
+ op.add_option("--cipher")
+ return op
diff --git a/pykickstart/commands/logvol.py b/pykickstart/commands/logvol.py
index 1e6579e..5fcb6e5 100644
--- a/pykickstart/commands/logvol.py
+++ b/pykickstart/commands/logvol.py
@@ -166,6 +166,26 @@ class F12_LogVolData(F9_LogVolData):
return retval
+class RHEL6_LogVolData(F12_LogVolData):
+ removedKeywords = F12_LogVolData.removedKeywords
+ removedAttrs = F12_LogVolData.removedAttrs
+
+ def __init__(self, *args, **kwargs):
+ F12_LogVolData.__init__(self, *args, **kwargs)
+
+ self.cipher = kwargs.get("cipher", "")
+ self.hibernation = kwargs.get("hibernation", False)
+
+ def _getArgsAsStr(self):
+ retval = F12_LogVolData._getArgsAsStr(self)
+
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+ if self.hibernation:
+ retval += " --hibernation"
+
+ return retval
+
F14_LogVolData = F12_LogVolData
class F15_LogVolData(F14_LogVolData):
@@ -200,6 +220,7 @@ class F18_LogVolData(F17_LogVolData):
def __init__(self, *args, **kwargs):
F17_LogVolData.__init__(self, *args, **kwargs)
self.hibernation = kwargs.get("hibernation", False)
+ self.cipher = kwargs.get("cipher", "")
def _getArgsAsStr(self):
retval = F17_LogVolData._getArgsAsStr(self)
@@ -207,6 +228,9 @@ class F18_LogVolData(F17_LogVolData):
if self.hibernation:
retval += " --hibernation"
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+
return retval
class FC3_LogVol(KickstartCommand):
@@ -316,6 +340,18 @@ class F12_LogVol(F9_LogVol):
op.add_option("--backuppassphrase", action="store_true", default=False)
return op
+class RHEL6_LogVol(F12_LogVol):
+ removedKeywords = F12_LogVol.removedKeywords
+ removedAttrs = F12_LogVol.removedAttrs
+
+ def _getParser(self):
+ op = F12_LogVol._getParser(self)
+ op.add_option("--cipher")
+ op.add_option("--hibernation", dest="hibernation", action="store_true",
+ default=False)
+
+ return op
+
class F14_LogVol(F12_LogVol):
removedKeywords = F12_LogVol.removedKeywords
removedAttrs = F12_LogVol.removedAttrs
@@ -355,5 +391,6 @@ class F18_LogVol(F17_LogVol):
def _getParser(self):
op = F17_LogVol._getParser(self)
op.add_option("--hibernation", action="store_true", default=False)
+ op.add_option("--cipher")
return op
diff --git a/pykickstart/commands/partition.py b/pykickstart/commands/partition.py
index e30f849..62aa8f4 100644
--- a/pykickstart/commands/partition.py
+++ b/pykickstart/commands/partition.py
@@ -186,6 +186,26 @@ class F12_PartData(F11_PartData):
return retval
+class RHEL6_PartData(F12_PartData):
+ removedKeywords = F12_PartData.removedKeywords
+ removedAttrs = F12_PartData.removedAttrs
+
+ def __init__(self, *args, **kwargs):
+ F12_PartData.__init__(self, *args, **kwargs)
+
+ self.cipher = kwargs.get("cipher", "")
+ self.hibernation = kwargs.get("hibernation", False)
+
+ def _getArgsAsStr(self):
+ retval = F12_PartData._getArgsAsStr(self)
+
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+ if self.hibernation:
+ retval += " --hibernation"
+
+ return retval
+
F14_PartData = F12_PartData
class F17_PartData(F14_PartData):
@@ -207,6 +227,7 @@ class F18_PartData(F17_PartData):
F17_PartData.__init__(self, *args, **kwargs)
self.hibernation = kwargs.get("hibernation", False)
+ self.cipher = kwargs.get("cipher", "")
def _getArgsAsStr(self):
retval = F17_PartData._getArgsAsStr(self)
@@ -214,6 +235,9 @@ class F18_PartData(F17_PartData):
if self.hibernation:
retval += " --hibernation"
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+
return retval
class FC3_Partition(KickstartCommand):
@@ -370,6 +394,17 @@ class F12_Partition(F11_Partition):
op.add_option("--backuppassphrase", action="store_true", default=False)
return op
+class RHEL6_Partition(F12_Partition):
+ removedKeywords = F12_Partition.removedKeywords
+ removedAttrs = F12_Partition.removedAttrs
+
+ def _getParser(self):
+ op = F12_Partition._getParser(self)
+ op.add_option("--cipher")
+ op.add_option("--hibernation", dest="hibernation", action="store_true",
+ default=False)
+ return op
+
class F14_Partition(F12_Partition):
removedKeywords = F12_Partition.removedKeywords
removedAttrs = F12_Partition.removedAttrs
@@ -402,5 +437,6 @@ class F18_Partition(F17_Partition):
def _getParser(self):
op = F17_Partition._getParser(self)
op.add_option("--hibernation", dest="hibernation", action="store_true", default=False)
+ op.add_option("--cipher")
return op
diff --git a/pykickstart/commands/raid.py b/pykickstart/commands/raid.py
index 4ba353d..d99f992 100644
--- a/pykickstart/commands/raid.py
+++ b/pykickstart/commands/raid.py
@@ -175,6 +175,23 @@ class F12_RaidData(F9_RaidData):
F13_RaidData = F12_RaidData
+class RHEL6_RaidData(F13_RaidData):
+ removedKeywords = F13_RaidData.removedKeywords
+ removedAttrs = F13_RaidData.removedAttrs
+
+ def __init__(self, *args, **kwargs):
+ F13_RaidData.__init__(self, *args, **kwargs)
+
+ self.cipher = kwargs.get("cipher", "")
+
+ def _getArgsAsStr(self):
+ retval = F13_RaidData._getArgsAsStr(self)
+
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+
+ return retval
+
F14_RaidData = F13_RaidData
class F15_RaidData(F14_RaidData):
@@ -195,6 +212,23 @@ class F15_RaidData(F14_RaidData):
return retval
+class F18_RaidData(F15_RaidData):
+ removedKeywords = F15_RaidData.removedKeywords
+ removedAttrs = F15_RaidData.removedAttrs
+
+ def __init__(self, *args, **kwargs):
+ F15_RaidData.__init__(self, *args, **kwargs)
+
+ self.cipher = kwargs.get("cipher", "")
+
+ def _getArgsAsStr(self):
+ retval = F15_RaidData._getArgsAsStr(self)
+
+ if self.encrypted and self.cipher:
+ retval += " --cipher=\"%s\"" % self.cipher
+
+ return retval
+
class FC3_Raid(KickstartCommand):
removedKeywords = KickstartCommand.removedKeywords
removedAttrs = KickstartCommand.removedAttrs
@@ -360,6 +394,15 @@ class F13_Raid(F12_Raid):
self.levelMap.update({"RAID4": "RAID4", "4": "RAID4"})
+class RHEL6_Raid(F13_Raid):
+ removedKeywords = F13_Raid.removedKeywords
+ removedAttrs = F13_Raid.removedAttrs
+
+ def _getParser(self):
+ op = F13_Raid._getParser(self)
+ op.add_option("--cipher")
+ return op
+
class F14_Raid(F13_Raid):
removedKeywords = F13_Raid.removedKeywords
removedAttrs = F13_Raid.removedAttrs
@@ -377,3 +420,12 @@ class F15_Raid(F14_Raid):
op = F14_Raid._getParser(self)
op.add_option("--label")
return op
+
+class F18_Raid(F15_Raid):
+ removedKeywords = F15_Raid.removedKeywords
+ removedAttrs = F15_Raid.removedAttrs
+
+ def _getParser(self):
+ op = F15_Raid._getParser(self)
+ op.add_option("--cipher")
+ return op
diff --git a/pykickstart/handlers/control.py b/pykickstart/handlers/control.py
index 0e02355..fb1424d 100644
--- a/pykickstart/handlers/control.py
+++ b/pykickstart/handlers/control.py
@@ -888,7 +888,7 @@ commandMap = {
F18: {
"auth": authconfig.FC3_Authconfig,
"authconfig": authconfig.FC3_Authconfig,
- "autopart": autopart.F17_AutoPart,
+ "autopart": autopart.F18_AutoPart,
"autostep": autostep.FC3_AutoStep,
"bootloader": bootloader.F18_Bootloader,
"btrfs": btrfs.F17_BTRFS,
@@ -921,7 +921,7 @@ commandMap = {
"part": partition.F18_Partition,
"partition": partition.F18_Partition,
"poweroff": reboot.F18_Reboot,
- "raid": raid.F15_Raid,
+ "raid": raid.F18_Raid,
"reboot": reboot.F18_Reboot,
"repo": repo.F15_Repo,
"rescue": rescue.F10_Rescue,
@@ -1107,7 +1107,7 @@ commandMap = {
RHEL6: {
"auth": authconfig.FC3_Authconfig,
"authconfig": authconfig.FC3_Authconfig,
- "autopart": autopart.F12_AutoPart,
+ "autopart": autopart.RHEL6_AutoPart,
"autostep": autostep.FC3_AutoStep,
"bootloader": bootloader.RHEL6_Bootloader,
"cdrom": method.RHEL6_Method,
@@ -1132,16 +1132,16 @@ commandMap = {
"keyboard": keyboard.FC3_Keyboard,
"lang": lang.FC3_Lang,
"logging": logging.FC6_Logging,
- "logvol": logvol.F12_LogVol,
+ "logvol": logvol.RHEL6_LogVol,
"mediacheck": mediacheck.FC4_MediaCheck,
"monitor": monitor.F10_Monitor,
"multipath": multipath.FC6_MultiPath,
"network": network.RHEL6_Network,
"nfs": method.RHEL6_Method,
- "part": partition.F12_Partition,
- "partition": partition.F12_Partition,
+ "part": partition.RHEL6_Partition,
+ "partition": partition.RHEL6_Partition,
"poweroff": reboot.FC6_Reboot,
- "raid": raid.F13_Raid,
+ "raid": raid.RHEL6_Raid,
"reboot": reboot.FC6_Reboot,
"repo": repo.RHEL6_Repo,
"rescue": rescue.F10_Rescue,
@@ -1467,7 +1467,7 @@ dataMap = {
"MultiPathData": multipath.FC6_MultiPathData,
"NetworkData": network.F16_NetworkData,
"PartData": partition.F18_PartData,
- "RaidData": raid.F15_RaidData,
+ "RaidData": raid.F18_RaidData,
"RepoData": repo.F15_RepoData,
"SshPwData": sshpw.F13_SshPwData,
"UserData": user.F12_UserData,
@@ -1513,11 +1513,11 @@ dataMap = {
"FcoeData": fcoe.F13_FcoeData,
"GroupData": group.F12_GroupData,
"IscsiData": iscsi.RHEL6_IscsiData,
- "LogVolData": logvol.F12_LogVolData,
+ "LogVolData": logvol.RHEL6_LogVolData,
"MultiPathData": multipath.FC6_MultiPathData,
"NetworkData": network.RHEL6_NetworkData,
- "PartData": partition.F12_PartData,
- "RaidData": raid.F13_RaidData,
+ "PartData": partition.RHEL6_PartData,
+ "RaidData": raid.RHEL6_RaidData,
"RepoData": repo.RHEL6_RepoData,
"SshPwData": sshpw.F13_SshPwData,
"UserData": user.F12_UserData,
diff --git a/tests/commands/autopart.py b/tests/commands/autopart.py
index a2b288a..f05124a 100644
--- a/tests/commands/autopart.py
+++ b/tests/commands/autopart.py
@@ -79,6 +79,19 @@ class F12_TestCase(F9_TestCase):
self.assert_parse_error("autopart --backuppassphrase=False")
self.assert_parse_error("autopart --backuppassphrase=True")
+class RHEL6_TestCase(F12_TestCase):
+ def runTest(self):
+ F12_TestCase.runTest(self)
+
+ # pass
+ self.assert_parse("autopart --cipher=foo", "autopart\n")
+ self.assert_parse("autopart --encrypted --cipher=3-rot13",
+ "autopart --encrypted --cipher=\"3-rot13\"\n")
+
+ # fail
+ self.assert_parse_error("autopart --cipher")
+ self.assert_parse_error("autopart --encrypted --cipher")
+
class F16_TestCase(F12_TestCase):
def runTest(self):
# Run F12 test case
@@ -118,5 +131,19 @@ class F17_TestCase(F16_TestCase):
# fail
self.assert_parse_error("autopart --type")
+class F18_TestCase(F17_TestCase):
+ def runTest(self):
+ F17_TestCase.runTest(self)
+
+ # pass
+ self.assert_parse("autopart --cipher=foo", "autopart\n")
+ self.assert_parse("autopart --encrypted --cipher=3-rot13",
+ "autopart --encrypted --cipher=\"3-rot13\"\n")
+
+ # fail
+ self.assert_parse_error("autopart --cipher")
+ self.assert_parse_error("autopart --encrypted --cipher")
+
+
if __name__ == "__main__":
unittest.main()
diff --git a/tests/commands/logvol.py b/tests/commands/logvol.py
index e255faf..cd868fd 100644
--- a/tests/commands/logvol.py
+++ b/tests/commands/logvol.py
@@ -181,6 +181,24 @@ class F12_TestCase(F9_TestCase):
self.assert_parse_error("logvol / --backuppassphrase=True --name=NAME "
"--vgname=VGNAME")
+class RHEL6_TestCase(F12_TestCase):
+ def runTest(self):
+ F12_TestCase.runTest(self)
+
+ self.assert_parse("logvol / --encrypted --cipher=3-rot13 --name=NAME --vgname=VGNAME",
+ "logvol / --encrypted --cipher=\"3-rot13\" --name=NAME --vgname=VGNAME\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("logvol / --cipher=3-rot13 --name=NAME --vgname=VGNAME",
+ "logvol / --name=NAME --vgname=VGNAME\n")
+
+ self.assert_parse_error("logvol / --cipher --name=NAME --vgname=VGNAME")
+
+ self.assert_parse("logvol swap --hibernation "
+ "--name=NAME --vgname=VGNAME")
+ self.assert_parse("logvol swap --recommended --hibernation "
+ "--name=NAME --vgname=VGNAME")
+
class F14_TestCase(F12_TestCase):
def runTest(self):
F12_TestCase.runTest(self)
@@ -216,5 +234,14 @@ class F18_TestCase(F17_TestCase):
self.assert_parse("logvol swap --name=NAME --vgname=VGNAME "\
"--recommended --hibernation")
+ self.assert_parse("logvol / --encrypted --cipher=3-rot13 --name=NAME --vgname=VGNAME",
+ "logvol / --encrypted --cipher=\"3-rot13\" --name=NAME --vgname=VGNAME\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("logvol / --cipher=3-rot13 --name=NAME --vgname=VGNAME",
+ "logvol / --name=NAME --vgname=VGNAME\n")
+
+ self.assert_parse_error("logvol / --cipher --name=NAME --vgname=VGNAME")
+
if __name__ == "__main__":
unittest.main()
diff --git a/tests/commands/partition.py b/tests/commands/partition.py
index 6df1510..6c81b9e 100644
--- a/tests/commands/partition.py
+++ b/tests/commands/partition.py
@@ -152,6 +152,22 @@ class F12_TestCase(F9_TestCase):
self.assert_parse_error("part / --backuppassphrase=False")
self.assert_parse_error("part / --backuppassphrase=True")
+class RHEL6_TestCase(F12_TestCase):
+ def runTest(self):
+ F12_TestCase.runTest(self)
+
+ self.assert_parse("part / --encrypted --cipher=3-rot13",
+ "part / --encrypted --cipher=\"3-rot13\"\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("part / --cipher=3-rot13",
+ "part /\n")
+
+ self.assert_parse_error("part / --cipher")
+
+ self.assert_parse("part swap --hibernation")
+ self.assert_parse("part swap --recommended --hibernation")
+
class F14_TestCase(F12_TestCase):
def runTest(self):
F12_TestCase.runTest(self)
@@ -181,5 +197,14 @@ class F18_TestCase(F17_TestCase):
self.assert_parse("part swap --recommended")
self.assert_parse("part swap --recommended --hibernation")
+ self.assert_parse("part / --encrypted --cipher=3-rot13",
+ "part / --encrypted --cipher=\"3-rot13\"\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("part / --cipher=3-rot13",
+ "part /\n")
+
+ self.assert_parse_error("part / --cipher")
+
if __name__ == "__main__":
unittest.main()
diff --git a/tests/commands/raid.py b/tests/commands/raid.py
index 7b6675a..bc63632 100644
--- a/tests/commands/raid.py
+++ b/tests/commands/raid.py
@@ -179,6 +179,19 @@ class F13_TestCase(F12_TestCase):
F12_TestCase.__init__(self, *kargs, **kwargs)
self.validLevels.append("RAID4")
+class RHEL6_TestCase(F13_TestCase):
+ def runTest(self):
+ F13_TestCase.runTest(self)
+
+ self.assert_parse("raid / --device=md0 --level=1 --encrypted --cipher=3-rot13 raid.01 raid.02",
+ "raid / --device=0 --level=RAID1 --encrypted --cipher=\"3-rot13\" raid.01 raid.02\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("raid / --device=md0 --level=1 --cipher=3-rot13 raid.01 raid.02",
+ "raid / --device=0 --level=RAID1 raid.01 raid.02\n")
+
+ self.assert_parse_error("raid / --cipher --device=md0 --level=1 raid.01 raid.02")
+
class F14_TestCase(F13_TestCase):
def runTest(self):
F13_TestCase.runTest(self)
@@ -192,5 +205,18 @@ class F15_TestCase(F14_TestCase):
self.assert_parse("raid / --device=md0 --label=ROOT --level=1 raid.01 raid.02",
"raid / --device=0 --level=RAID1 --label=ROOT raid.01 raid.02\n")
+class F18_TestCase(F15_TestCase):
+ def runTest(self):
+ F15_TestCase.runTest(self)
+
+ self.assert_parse("raid / --device=md0 --level=1 --encrypted --cipher=3-rot13 raid.01 raid.02",
+ "raid / --device=0 --level=RAID1 --encrypted --cipher=\"3-rot13\" raid.01 raid.02\n")
+ # Allowed here, but anaconda should complain. Note how we throw out
+ # cipher from the output if there's no --encrypted.
+ self.assert_parse("raid / --device=md0 --level=1 --cipher=3-rot13 raid.01 raid.02",
+ "raid / --device=0 --level=RAID1 raid.01 raid.02\n")
+
+ self.assert_parse_error("raid / --cipher --device=md0 --level=1 raid.01 raid.02")
+
if __name__ == "__main__":
unittest.main()
--
1.7.11.4
More information about the anaconda-patches
mailing list