There's a lot of code in main() at the moment that looks to
me like it would be better in InstallationTarget()
To that end:
- Make the InstallationTarget constructor take the majority
of command-line options
- Add a parse() method which parses the kickstart file, and
adds packages/repos/etc.
- Consolidate all the install stuff into a new install()
method
- Consolidate the "package the system image into an ISO" stuff
into a package() method
Signed-off-by: Mark McLoughlin <markmc(a)redhat.com>
Index: livecd/creator/livecd-creator
===================================================================
--- livecd.orig/creator/livecd-creator
+++ livecd/creator/livecd-creator
@@ -268,9 +268,41 @@ def get_kernel_version(root):
return kver
class InstallationTarget:
- def __init__(self):
+ def __init__(self, repos, packages, epackages, groups, fs_label, skip_compression):
self.ayum = LiveCDYum()
+ self.repos = repos
+ self.packages = packages
+ self.epackages = epackages
+ self.groups = groups
+ self.fs_label = fs_label
+ self.skip_compression = skip_compression
+
+ self.build_dir = None
+ self.instloop = None
+ self.bindmounts = []
+ self.ksparser = None
+ def parse(self, kscfg):
+ ksversion = pykickstart.version.makeVersion()
+ self.ksparser = pykickstart.parser.KickstartParser(ksversion)
+ if kscfg:
+ self.ksparser.readKickstart(kscfg)
+
+ for repo in self.ksparser.handler.repo.repoList:
+ already_given = False
+ for cmd_name, cmd_url in self.repos:
+ if cmd_name == repo.name:
+ already_given = True
+ break
+
+ if not already_given:
+ self.repos.append( (repo.name, repo.baseurl) )
+
+ self.packages.extend(self.ksparser.handler.packages.packageList)
+ self.groups.extend(map(lambda g: (g.name, g.include),
+ self.ksparser.handler.packages.groupList))
+ self.epackages.extend(self.ksparser.handler.packages.excludedList)
+
def base_on_iso(self, base_on):
"""helper function to extract ext3 file system from a live CD
ISO"""
@@ -299,14 +331,9 @@ class InstallationTarget:
return success
- def setup(self, image_size, fs_label, base_on):
+ def setup(self, image_size, base_on = None):
"""setup target ext3 file system in preparation for an
install"""
- # global variables needed
- self.fs_label = fs_label
- self.instloop = None
- self.bindmounts = []
-
# setup temporary build dirs
try:
self.build_dir = tempfile.mkdtemp(dir="/var/tmp",
prefix="livecd-creator-")
@@ -569,11 +596,11 @@ class InstallationTarget:
def relabelSystem(self):
# finally relabel all files
- instroot = "%s/install_root" %(self.build_dir,)
- if os.path.exists("%s/sbin/restorecon" %(instroot,)):
- subprocess.call(["/sbin/restorecon", "-v",
"-r", "/"],
- preexec_fn=self.run_in_root)
- return True
+ if self.ksparser.handler.selinux.selinux:
+ instroot = "%s/install_root" %(self.build_dir,)
+ if os.path.exists("%s/sbin/restorecon" %(instroot,)):
+ subprocess.call(["/sbin/restorecon", "-v",
"-r", "/"],
+ preexec_fn=self.run_in_root)
def launchShell(self):
print "Launching shell. Exit to continue."
@@ -644,13 +671,21 @@ label runfromram
# TODO: enable external entitity to partipate in adding boot entries
+ def install(self):
+ for (name, url) in self.repos:
+ self.ayum.addRepository(name, url)
+
+ if not self.installPackages(self.packages, self.epackages, self.groups):
+ self.teardown()
+ sys.exit(1)
+
+ self.configureSystem(self.ksparser)
+ self.relabelSystem()
+ self.createInitramfs()
+ self.configureBootloader()
+
def createIso(self, filename):
"""write out the live CD ISO"""
-
- # ship the ext3 image if there is no compressed image (happens during
--skip-compression)
- if not os.path.exists("%s/out/squashfs.img" %(self.build_dir,)):
- shutil.move("%s/data/os.img" %(self.build_dir,),
"%s/out/ext3fs.img" %(self.build_dir,))
-
subprocess.call(["/usr/bin/mkisofs", "-o", "%s.iso"
%(filename,),
"-b", "isolinux/isolinux.bin",
"-c", "isolinux/boot.cat",
@@ -660,11 +695,19 @@ label runfromram
def createSquashFS(self):
"""create compressed squashfs file system"""
- # FIXME: mksquashfs segfaults if PWD isn't set in the environment
- subprocess.call(["/sbin/mksquashfs", "os.img",
"sysroot",
- "../out/squashfs.img"],
- cwd="%s/data" %(self.build_dir,),
- env={"PWD": "%s/data" %(self.build_dir,)})
+ if not self.skip_compression:
+ # FIXME: mksquashfs segfaults if PWD isn't set in the environment
+ subprocess.call(["/sbin/mksquashfs", "os.img",
"sysroot",
+ "../out/squashfs.img"],
+ cwd="%s/data" %(self.build_dir,),
+ env={"PWD": "%s/data"
%(self.build_dir,)})
+ else:
+ shutil.move("%s/data/os.img" %(self.build_dir,),
+ "%s/out/ext3fs.img" %(self.build_dir,))
+
+ def package(self):
+ self.createSquashFS()
+ self.createIso(self.fs_label)
def usage():
print """
@@ -770,56 +813,28 @@ def main():
print "Unknown option %s"%o
sys.exit(2)
- ksversion = pykickstart.version.makeVersion()
- ksparser = pykickstart.parser.KickstartParser(ksversion)
- if not kscfg:
- if len(packages) == 0:
- print "No packages specified."
- print ""
- usage()
- sys.exit(1)
+ if not kscfg and not (packages or groups):
+ print "No packages or groups specified."
+ print ""
+ usage()
+ sys.exit(1)
- if len(repos) == 0:
- print "No repositories specified."
- print ""
- usage()
- sys.exit(1)
- else:
- ksparser.readKickstart(kscfg)
+ if not kscfg and not repos:
+ print "No repositories specified."
+ print ""
+ usage()
+ sys.exit(1)
- for repo in ksparser.handler.repo.repoList:
- given_on_cmd_line = False
- for cmd_name, cmd_url in repos:
- if cmd_name == repo.name:
- given_on_cmd_line = True
- break
-
- if not given_on_cmd_line:
- repos.append( (repo.name, repo.baseurl) )
-
- packages.extend(ksparser.handler.packages.packageList)
- groups.extend(map(lambda g: (g.name, g.include),
- ksparser.handler.packages.groupList))
- epackages.extend(ksparser.handler.packages.excludedList)
+ target = InstallationTarget(repos, packages, epackages, groups, fs_label,
skip_compression)
- target = InstallationTarget()
+ target.parse(kscfg)
- if not target.setup(uncompressed_size, fs_label, base_on):
+ if not target.setup(uncompressed_size, base_on):
print "Cannot setup installation target. Aborting."
sys.exit(1)
try:
- for (n, u) in repos:
- target.addRepository(n, u)
-
- if not target.installPackages(packages, epackages, groups):
- target.teardown()
- sys.exit(1)
- target.configureSystem(ksparser)
- target.createInitramfs()
- if ksparser.handler.selinux.selinux:
- target.relabelSystem()
- target.configureBootloader()
+ target.install()
except SystemExit:
sys.exit(1)
except:
@@ -833,9 +848,7 @@ def main():
target.launchShell()
target.unmount()
- if not skip_compression:
- target.createSquashFS()
- target.createIso(fs_label)
+ target.package()
target.teardown()
if __name__ == "__main__":
--