3 Builder class for a netboot build, version 2
7 from catalyst_support import *
8 from generic_stage_target import *
10 class netboot2_target(generic_stage_target):
11 def __init__(self,spec,addlargs):
12 self.required_values=[
15 self.valid_values=self.required_values[:]
16 self.valid_values.extend([
19 "netboot2/extra_files",
21 "netboot2/busybox_config",
22 "netboot2/root_overlay",
27 if addlargs.has_key("netboot2/packages"):
28 if type(addlargs["netboot2/packages"]) == types.StringType:
29 loopy=[addlargs["netboot2/packages"]]
31 loopy=addlargs["netboot2/packages"]
34 self.valid_values.append("netboot2/packages/"+x+"/files")
36 raise CatalystError,"configuration error in netboot2/packages."
38 generic_stage_target.__init__(self,spec,addlargs)
39 self.set_build_kernel_vars()
40 self.settings["merge_path"]=normpath("/tmp/image/")
42 def set_target_path(self):
43 self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+\
44 self.settings["target_subpath"]+"/")
45 if self.settings.has_key("AUTORESUME") \
46 and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"):
47 print "Resume point detected, skipping target path setup operation..."
49 # first clean up any existing target stuff
50 if os.path.isfile(self.settings["target_path"]):
51 cmd("rm -f "+self.settings["target_path"], \
52 "Could not remove existing file: "+self.settings["target_path"],env=self.env)
53 touch(self.settings["autoresume_path"]+"setup_target_path")
55 if not os.path.exists(self.settings["storedir"]+"/builds/"):
56 os.makedirs(self.settings["storedir"]+"/builds/")
58 def copy_files_to_image(self):
59 # copies specific files from the buildroot to merge_path
62 # check for autoresume point
63 if self.settings.has_key("AUTORESUME") \
64 and os.path.exists(self.settings["autoresume_path"]+"copy_files_to_image"):
65 print "Resume point detected, skipping target path setup operation..."
67 if self.settings.has_key("netboot2/packages"):
68 if type(self.settings["netboot2/packages"]) == types.StringType:
69 loopy=[self.settings["netboot2/packages"]]
71 loopy=self.settings["netboot2/packages"]
74 if self.settings.has_key("netboot2/packages/"+x+"/files"):
75 if type(self.settings["netboot2/packages/"+x+"/files"]) == types.ListType:
76 myfiles.extend(self.settings["netboot2/packages/"+x+"/files"])
78 myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
80 if self.settings.has_key("netboot2/extra_files"):
81 if type(self.settings["netboot2/extra_files"]) == types.ListType:
82 myfiles.extend(self.settings["netboot2/extra_files"])
84 myfiles.append(self.settings["netboot2/extra_files"])
87 cmd("/bin/bash "+self.settings["controller_file"]+\
88 " image " + list_bashify(myfiles),env=self.env)
91 raise CatalystError,"Failed to copy files to image!"
93 touch(self.settings["autoresume_path"]+"copy_files_to_image")
95 def setup_overlay(self):
96 if self.settings.has_key("AUTORESUME") \
97 and os.path.exists(self.settings["autoresume_path"]+"setup_overlay"):
98 print "Resume point detected, skipping setup_overlay operation..."
100 if self.settings.has_key("netboot2/overlay"):
101 for x in self.settings["netboot2/overlay"]:
102 if os.path.exists(x):
103 cmd("rsync -a "+x+"/ "+\
104 self.settings["chroot_path"] + self.settings["merge_path"], "netboot2/overlay: "+x+" copy failed.",env=self.env)
105 touch(self.settings["autoresume_path"]+"setup_overlay")
107 def move_kernels(self):
108 # we're done, move the kernels to builds/*
109 # no auto resume here as we always want the
110 # freshest images moved
112 cmd("/bin/bash "+self.settings["controller_file"]+\
113 " final",env=self.env)
114 print ">>> Netboot Build Finished!"
115 except CatalystError:
117 raise CatalystError,"Failed to move kernel images!"
120 if self.settings.has_key("AUTORESUME") \
121 and os.path.exists(self.settings["autoresume_path"]+"remove"):
122 print "Resume point detected, skipping remove operation..."
124 if self.settings.has_key(self.settings["spec_prefix"]+"/rm"):
125 for x in self.settings[self.settings["spec_prefix"]+"/rm"]:
126 # we're going to shell out for all these cleaning operations,
127 # so we get easy glob handling
128 print "netboot2: removing " + x
129 os.system("rm -rf " + self.settings["chroot_path"] + self.settings["merge_path"] + x)
132 if self.settings.has_key("AUTORESUME") \
133 and os.path.exists(self.settings["autoresume_path"]+"empty"):
134 print "Resume point detected, skipping empty operation..."
136 if self.settings.has_key("netboot2/empty"):
137 if type(self.settings["netboot2/empty"])==types.StringType:
138 self.settings["netboot2/empty"]=self.settings["netboot2/empty"].split()
139 for x in self.settings["netboot2/empty"]:
140 myemp=self.settings["chroot_path"] + self.settings["merge_path"] + x
141 if not os.path.isdir(myemp):
142 print x,"not a directory or does not exist, skipping 'empty' operation."
144 print "Emptying directory", x
145 # stat the dir, delete the dir, recreate the dir and set
146 # the proper perms and ownership
147 mystat=os.stat(myemp)
149 os.makedirs(myemp,0755)
150 os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
151 os.chmod(myemp,mystat[ST_MODE])
152 touch(self.settings["autoresume_path"]+"empty")
154 def set_action_sequence(self):
155 self.settings["action_sequence"]=["unpack","unpack_snapshot","config_profile_link",
156 "setup_confdir","portage_overlay","bind","chroot_setup",\
157 "setup_environment","build_packages","root_overlay",\
158 "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
159 "remove","empty","unbind","clean","clear_autoresume"]
162 foo.update({"netboot2":netboot2_target})