X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=modules%2Flivecd_stage2_target.py;h=5be8fd23870d7955eee29230de511ddd8ea5b84f;hb=1082b4471613842494261d74ec2598b4191056c9;hp=04da3821aa5e5e31fe6ef20e0dd47cd48957b79f;hpb=ea033ec33866a6964c32b7296554e3434636b1dd;p=catalyst.git diff --git a/modules/livecd_stage2_target.py b/modules/livecd_stage2_target.py index 04da3821..5be8fd23 100644 --- a/modules/livecd_stage2_target.py +++ b/modules/livecd_stage2_target.py @@ -1,107 +1,145 @@ -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/livecd_stage2_target.py,v 1.33 2005/04/11 20:44:47 rocket Exp $ - """ -Builder class for a LiveCD stage2 build. +LiveCD stage2 target, builds upon previous LiveCD stage1 tarball """ +# NOTE: That^^ docstring has influence catalyst-spec(5) man page generation. import os,string,types,stat,shutil from catalyst_support import * from generic_stage_target import * class livecd_stage2_target(generic_stage_target): + """ + Builder class for a LiveCD stage2 build. + """ def __init__(self,spec,addlargs): - self.required_values=["boot/kernel","livecd/cdfstype"] - + self.required_values=["boot/kernel"] + self.valid_values=[] - + self.valid_values.extend(self.required_values) self.valid_values.extend(["livecd/cdtar","livecd/empty","livecd/rm",\ "livecd/unmerge","livecd/iso","livecd/gk_mainargs","livecd/type",\ - "livecd/motd","livecd/overlay","livecd/modblacklist","livecd/splash_theme",\ - "livecd/rcadd","livecd/rcdel","livecd/fsscript","livecd/xinitrc",\ - "livecd/root_overlay","livecd/devmanager","livecd/splash_type",\ - "gamecd/conf","portage_overlay"]) - + "livecd/readme","livecd/motd","livecd/overlay",\ + "livecd/modblacklist","livecd/splash_theme","livecd/rcadd",\ + "livecd/rcdel","livecd/fsscript","livecd/xinitrc",\ + "livecd/root_overlay","livecd/users","portage_overlay",\ + "livecd/fstype","livecd/fsops","livecd/linuxrc","livecd/bootargs",\ + "gamecd/conf","livecd/xdm","livecd/xsession","livecd/volid"]) + generic_stage_target.__init__(self,spec,addlargs) - - file_locate(self.settings, ["livecd/cdtar","controller_file"]) - + if "livecd/type" not in self.settings: + self.settings["livecd/type"] = "generic-livecd" + + file_locate(self.settings, ["cdtar","controller_file"]) - def set_target_path(self): - self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] - def set_source_path(self): - self.settings["source_path"]=self.settings["storedir"]+"/builds/"+self.settings["source_subpath"]+".tar.bz2" - if os.path.isfile(self.settings["source_path"]): - if os.path.exists(self.settings["source_path"]): - self.settings["source_path_md5sum"]=calc_md5(self.settings["source_path"]) - else: - self.settings["source_path"]=self.settings["storedir"]+"/tmp/"+self.settings["source_subpath"] - + self.settings["source_path"]=normpath(self.settings["storedir"]+"/builds/"+self.settings["source_subpath"]+".tar.bz2") + if os.path.isfile(self.settings["source_path"]): + self.settings["source_path_hash"]=generate_hash(self.settings["source_path"]) + else: + self.settings["source_path"]=normpath(self.settings["storedir"]+"/tmp/"+self.settings["source_subpath"]+"/") + if not os.path.exists(self.settings["source_path"]): + raise CatalystError,"Source Path: "+self.settings["source_path"]+" does not exist." + def set_spec_prefix(self): self.settings["spec_prefix"]="livecd" - - def unpack(self): - if not os.path.isdir(self.settings["source_path"]): - generic_stage_target.unpack(self) + def set_target_path(self): + self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+self.settings["target_subpath"]+"/") + if "AUTORESUME" in self.settings \ + and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"): + print "Resume point detected, skipping target path setup operation..." else: - if self.settings.has_key("AUTORESUME") \ - and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack"): - print "Resume point detected, skipping unpack operation..." - else: - if not os.path.exists(self.settings["chroot_path"]): - os.makedirs(self.settings["chroot_path"]) - - print "Copying livecd-stage1 result to new livecd-stage2 work directory..." - cmd("rsync -a --delete "+self.settings["source_path"]+"/* "+self.settings["chroot_path"],\ - "Error copying initial livecd-stage2") - touch(self.settings["chroot_path"]+"/tmp/.clst_unpack") - - # Create the dir_setup autoresume point as the rsync --delete probably deleted it - touch(self.settings["chroot_path"]+"/tmp/.clst_dir_setup") - + # first clean up any existing target stuff + if os.path.isdir(self.settings["target_path"]): + cmd("rm -rf "+self.settings["target_path"], + "Could not remove existing directory: "+self.settings["target_path"],env=self.env) + touch(self.settings["autoresume_path"]+"setup_target_path") + if not os.path.exists(self.settings["target_path"]): + os.makedirs(self.settings["target_path"]) + def run_local(self): - # first clean up any existing target stuff - if os.path.exists(self.settings["target_path"]): - print "cleaning previous livecd-stage2 build" - cmd("rm -rf "+self.settings["target_path"], - "Could not remove existing directory: "+self.settings["target_path"]) - - if not os.path.exists(self.settings["target_path"]): - os.makedirs(self.settings["target_path"]) - # what modules do we want to blacklist? - if self.settings.has_key("livecd/modblacklist"): + if "livecd/modblacklist" in self.settings: try: - myf=open(self.settings["chroot_path"]+"/etc/hotplug/blacklist","a") + myf=open(self.settings["chroot_path"]+"/etc/modprobe.d/blacklist.conf","a") except: self.unbind() - raise CatalystError,"Couldn't open "+self.settings["chroot_path"]+"/etc/hotplug/blacklist." + raise CatalystError,"Couldn't open "+self.settings["chroot_path"]+"/etc/modprobe.d/blacklist.conf." + myf.write("\n#Added by Catalyst:") + # workaround until config.py is using configparser + if isinstance(self.settings["livecd/modblacklist"], str): + self.settings["livecd/modblacklist"] = self.settings["livecd/modblacklist"].split() for x in self.settings["livecd/modblacklist"]: - myf.write("\n"+x) + myf.write("\nblacklist "+x) myf.close() - def bootloader(self): - try: - cmd("/bin/bash "+self.settings["controller_file"]+" bootloader",\ - "Bootloader runscript failed.") - - except CatalystError: - self.unbind() - raise CatalystError,"Runscript aborting due to error." + def unpack(self): + unpack=True + display_msg=None + + clst_unpack_hash=read_from_clst(self.settings["autoresume_path"]+"unpack") + + if os.path.isdir(self.settings["source_path"]): + unpack_cmd="rsync -a --delete "+self.settings["source_path"]+" "+self.settings["chroot_path"] + display_msg="\nStarting rsync from "+self.settings["source_path"]+"\nto "+\ + self.settings["chroot_path"]+" (This may take some time) ...\n" + error_msg="Rsync of "+self.settings["source_path"]+" to "+self.settings["chroot_path"]+" failed." + invalid_snapshot=False + + if "AUTORESUME" in self.settings: + if os.path.isdir(self.settings["source_path"]) and \ + os.path.exists(self.settings["autoresume_path"]+"unpack"): + print "Resume point detected, skipping unpack operation..." + unpack=False + elif "source_path_hash" in self.settings: + if self.settings["source_path_hash"] != clst_unpack_hash: + invalid_snapshot=True + + if unpack: + self.mount_safety_check() + if invalid_snapshot: + print "No Valid Resume point detected, cleaning up ..." + #os.remove(self.settings["autoresume_path"]+"dir_setup") + self.clear_autoresume() + self.clear_chroot() + #self.dir_setup() + + if not os.path.exists(self.settings["chroot_path"]): + os.makedirs(self.settings["chroot_path"]) + + if not os.path.exists(self.settings["chroot_path"]+"/tmp"): + os.makedirs(self.settings["chroot_path"]+"/tmp",1777) + + if "PKGCACHE" in self.settings: + if not os.path.exists(self.settings["pkgcache_path"]): + os.makedirs(self.settings["pkgcache_path"],0755) + + if not display_msg: + raise CatalystError,"Could not find appropriate source. Please check the 'source_subpath' setting in the spec file." + + print display_msg + cmd(unpack_cmd,error_msg,env=self.env) + + if "source_path_hash" in self.settings: + myf=open(self.settings["autoresume_path"]+"unpack","w") + myf.write(self.settings["source_path_hash"]) + myf.close() + else: + touch(self.settings["autoresume_path"]+"unpack") def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ - "config_profile_link","setup_confdir","portage_overlay",\ - "bind","chroot_setup","setup_environment","run_local",\ - "root_overlay","build_kernel","bootloader","preclean",\ - "fsscript","rcupdate","clear_autoresume",\ - "unmerge","unbind","remove","empty","target_setup",\ - "setup_overlay","create_iso"] + self.settings["action_sequence"]=["unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","portage_overlay",\ + "bind","chroot_setup","setup_environment","run_local",\ + "build_kernel"] + if "FETCH" not in self.settings: + self.settings["action_sequence"] += ["bootloader","preclean",\ + "livecd_update","root_overlay","fsscript","rcupdate","unmerge",\ + "unbind","remove","empty","target_setup",\ + "setup_overlay","create_iso"] + self.settings["action_sequence"].append("clear_autoresume") def register(foo): foo.update({"livecd-stage2":livecd_stage2_target})