Rename netboot2 target to netboot
[catalyst.git] / modules / catalyst / target / netboot.py
index 6bbca71efe899df4606816541b880ad4116042b4..534861d2635d5c2a055faea478b451dc2f22de4b 100644 (file)
@@ -1,6 +1,6 @@
 
 """
-Builder class for a netboot build.
+Builder class for a netboot build, version 2
 """
 
 import os,string,types
@@ -12,17 +12,19 @@ from catalyst.spawn import *
 
 class netboot_target(generic_stage_target):
        def __init__(self,spec,addlargs):
-               self.valid_values = [
-                       "netboot/kernel/sources",
-                       "netboot/kernel/config",
-                       "netboot/kernel/prebuilt",
-
-                       "netboot/busybox_config",
-
-                       "netboot/extra_files",
-                       "netboot/packages"
+               self.required_values=[
+                       "boot/kernel"
                ]
-               self.required_values=[]
+               self.valid_values=self.required_values[:]
+               self.valid_values.extend([
+                       "netboot/packages",
+                       "netboot/use",
+                       "netboot/extra_files",
+                       "netboot/overlay",
+                       "netboot/busybox_config",
+                       "netboot/root_overlay",
+                       "netboot/linuxrc"
+               ])
 
                try:
                        if "netboot/packages" in addlargs:
@@ -31,103 +33,132 @@ class netboot_target(generic_stage_target):
                                else:
                                        loopy=addlargs["netboot/packages"]
 
-               #       for x in loopy:
-               #               self.required_values.append("netboot/packages/"+x+"/files")
+                               for x in loopy:
+                                       self.valid_values.append("netboot/packages/"+x+"/files")
                except:
                        raise CatalystError,"configuration error in netboot/packages."
 
-
-
-
                generic_stage_target.__init__(self,spec,addlargs)
-               self.set_build_kernel_vars(addlargs)
-               if "netboot/busybox_config" in addlargs:
-                       file_locate(self.settings, ["netboot/busybox_config"])
-
-               # Custom Kernel Tarball --- use that instead ...
-
-               # unless the user wants specific CFLAGS/CXXFLAGS, let's use -Os
-
-               for envvar in "CFLAGS", "CXXFLAGS":
-                       if not envvar in os.environ and not envvar in addlargs:
-                               self.settings[envvar] = "-Os -pipe"
-
-
-       def set_root_path(self):
-               # ROOT= variable for emerges
-               self.settings["root_path"]=catalyst.util.normpath("/tmp/image")
-               print "netboot root path is "+self.settings["root_path"]
-
-#      def build_packages(self):
-#              # build packages
-#              if "netboot/packages" in self.settings:
-#                      mypack = catalyst.util.list_bashify(self.settings["netboot/packages"])
-#              try:
-#                      cmd("/bin/bash "+self.settings["controller_file"]+" packages "+mypack,env=self.env)
-#              except CatalystError:
-#                      self.unbind()
-#                      raise CatalystError,"netboot build aborting due to error."
-
-       def build_busybox(self):
-               # build busybox
-               if "netboot/busybox_config" in self.settings:
-                       mycmd = self.settings["netboot/busybox_config"]
+               self.set_build_kernel_vars()
+               self.settings["merge_path"]=catalyst.util.normpath("/tmp/image/")
+
+       def set_target_path(self):
+               self.settings["target_path"]=catalyst.util.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:
-                       mycmd = ""
-               try:
-                       cmd("/bin/bash "+self.settings["controller_file"]+" busybox "+ mycmd,env=self.env)
-               except CatalystError:
-                       self.unbind()
-                       raise CatalystError,"netboot build aborting due to error."
+                       # first clean up any existing target stuff
+                       if os.path.isfile(self.settings["target_path"]):
+                               cmd("rm -f "+self.settings["target_path"], \
+                                       "Could not remove existing file: "+self.settings["target_path"],env=self.env)
+                               catalyst.util.touch(self.settings["autoresume_path"]+"setup_target_path")
 
+               if not os.path.exists(self.settings["storedir"]+"/builds/"):
+                       os.makedirs(self.settings["storedir"]+"/builds/")
 
        def copy_files_to_image(self):
-               # create image
+               # copies specific files from the buildroot to merge_path
                myfiles=[]
-               if "netboot/packages" in self.settings:
-                       if type(self.settings["netboot/packages"]) == types.StringType:
-                               loopy=[self.settings["netboot/packages"]]
-                       else:
-                               loopy=self.settings["netboot/packages"]
-
-               for x in loopy:
-                       if "netboot/packages/"+x+"/files" in self.settings:
-                           if type(self.settings["netboot/packages/"+x+"/files"]) == types.ListType:
-                                   myfiles.extend(self.settings["netboot/packages/"+x+"/files"])
-                           else:
-                                   myfiles.append(self.settings["netboot/packages/"+x+"/files"])
-
-               if "netboot/extra_files" in self.settings:
-                       if type(self.settings["netboot/extra_files"]) == types.ListType:
-                               myfiles.extend(self.settings["netboot/extra_files"])
-                       else:
-                               myfiles.append(self.settings["netboot/extra_files"])
 
-               try:
-                       cmd("/bin/bash "+self.settings["controller_file"]+\
-                               " image " + catalyst.util.list_bashify(myfiles),env=self.env)
-               except CatalystError:
-                       self.unbind()
-                       raise CatalystError,"netboot build aborting due to error."
+               # check for autoresume point
+               if "AUTORESUME" in self.settings \
+                       and os.path.exists(self.settings["autoresume_path"]+"copy_files_to_image"):
+                               print "Resume point detected, skipping target path setup operation..."
+               else:
+                       if "netboot/packages" in self.settings:
+                               if type(self.settings["netboot/packages"]) == types.StringType:
+                                       loopy=[self.settings["netboot/packages"]]
+                               else:
+                                       loopy=self.settings["netboot/packages"]
+
+                       for x in loopy:
+                               if "netboot/packages/"+x+"/files" in self.settings:
+                                   if type(self.settings["netboot/packages/"+x+"/files"]) == types.ListType:
+                                           myfiles.extend(self.settings["netboot/packages/"+x+"/files"])
+                                   else:
+                                           myfiles.append(self.settings["netboot/packages/"+x+"/files"])
+
+                       if "netboot/extra_files" in self.settings:
+                               if type(self.settings["netboot/extra_files"]) == types.ListType:
+                                       myfiles.extend(self.settings["netboot/extra_files"])
+                               else:
+                                       myfiles.append(self.settings["netboot/extra_files"])
 
+                       try:
+                               cmd("/bin/bash "+self.settings["controller_file"]+\
+                                       " image " + catalyst.util.list_bashify(myfiles),env=self.env)
+                       except CatalystError:
+                               self.unbind()
+                               raise CatalystError,"Failed to copy files to image!"
 
-       def create_netboot_files(self):
-               # finish it all up
+                       catalyst.util.touch(self.settings["autoresume_path"]+"copy_files_to_image")
+
+       def setup_overlay(self):
+               if "AUTORESUME" in self.settings \
+               and os.path.exists(self.settings["autoresume_path"]+"setup_overlay"):
+                       print "Resume point detected, skipping setup_overlay operation..."
+               else:
+                       if "netboot/overlay" in self.settings:
+                               for x in self.settings["netboot/overlay"]:
+                                       if os.path.exists(x):
+                                               cmd("rsync -a "+x+"/ "+\
+                                                       self.settings["chroot_path"] + self.settings["merge_path"], "netboot/overlay: "+x+" copy failed.",env=self.env)
+                               catalyst.util.touch(self.settings["autoresume_path"]+"setup_overlay")
+
+       def move_kernels(self):
+               # we're done, move the kernels to builds/*
+               # no auto resume here as we always want the
+               # freshest images moved
                try:
-                       cmd("/bin/bash "+self.settings["controller_file"]+" finish",env=self.env)
+                       cmd("/bin/bash "+self.settings["controller_file"]+\
+                               " final",env=self.env)
+                       print ">>> Netboot Build Finished!"
                except CatalystError:
                        self.unbind()
-                       raise CatalystError,"netboot build aborting due to error."
-
-               # end
-               print "netboot: build finished !"
+                       raise CatalystError,"Failed to move kernel images!"
 
+       def remove(self):
+               if "AUTORESUME" in self.settings \
+                       and os.path.exists(self.settings["autoresume_path"]+"remove"):
+                       print "Resume point detected, skipping remove operation..."
+               else:
+                       if self.settings["spec_prefix"]+"/rm" in self.settings:
+                               for x in self.settings[self.settings["spec_prefix"]+"/rm"]:
+                                       # we're going to shell out for all these cleaning operations,
+                                       # so we get easy glob handling
+                                       print "netboot: removing " + x
+                                       os.system("rm -rf " + self.settings["chroot_path"] + self.settings["merge_path"] + x)
+
+       def empty(self):
+               if "AUTORESUME" in self.settings \
+                       and os.path.exists(self.settings["autoresume_path"]+"empty"):
+                       print "Resume point detected, skipping empty operation..."
+               else:
+                       if "netboot/empty" in self.settings:
+                               if type(self.settings["netboot/empty"])==types.StringType:
+                                       self.settings["netboot/empty"]=self.settings["netboot/empty"].split()
+                               for x in self.settings["netboot/empty"]:
+                                       myemp=self.settings["chroot_path"] + self.settings["merge_path"] + x
+                                       if not os.path.isdir(myemp):
+                                               print x,"not a directory or does not exist, skipping 'empty' operation."
+                                               continue
+                                       print "Emptying directory", x
+                                       # stat the dir, delete the dir, recreate the dir and set
+                                       # the proper perms and ownership
+                                       mystat=os.stat(myemp)
+                                       shutil.rmtree(myemp)
+                                       os.makedirs(myemp,0755)
+                                       os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
+                                       os.chmod(myemp,mystat[ST_MODE])
+               catalyst.util.touch(self.settings["autoresume_path"]+"empty")
 
        def set_action_sequence(self):
-           self.settings["action_sequence"]=["unpack","unpack_snapshot",
-                                       "config_profile_link","setup_confdir","bind","chroot_setup",\
-                                               "setup_environment","build_packages","build_busybox",\
-                                               "build_kernel","copy_files_to_image",\
-                                               "clean","create_netboot_files","unbind","clear_autoresume"]
+           self.settings["action_sequence"]=["unpack","unpack_snapshot","config_profile_link",
+                                       "setup_confdir","portage_overlay","bind","chroot_setup",\
+                                       "setup_environment","build_packages","root_overlay",\
+                                       "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
+                                       "remove","empty","unbind","clean","clear_autoresume"]
 
 __target_map = {"netboot":netboot_target}