"""
-Builder class for a netboot build.
+Builder class for a netboot build, version 2
"""
import os,string,types
from catalyst.support import *
from generic_stage import *
import catalyst.util
+from catalyst.error import *
+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:
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"]=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}