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"
26 if addlargs.has_key("netboot2/packages"):
27 if type(addlargs["netboot2/packages"]) == types.StringType:
28 loopy=[addlargs["netboot2/packages"]]
30 loopy=addlargs["netboot2/packages"]
33 self.valid_values.append("netboot2/packages/"+x+"/files")
35 raise CatalystError,"configuration error in netboot2/packages."
37 generic_stage_target.__init__(self,spec,addlargs)
38 self.set_build_kernel_vars()
39 self.settings["merge_path"]=normpath("/tmp/image/")
41 def set_target_path(self):
42 self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+\
43 self.settings["target_subpath"]+"/")
44 if self.settings.has_key("AUTORESUME") \
45 and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"):
46 print "Resume point detected, skipping target path setup operation..."
48 # first clean up any existing target stuff
49 if os.path.isfile(self.settings["target_path"]):
50 cmd("rm -f "+self.settings["target_path"], \
51 "Could not remove existing file: "+self.settings["target_path"],env=self.env)
52 touch(self.settings["autoresume_path"]+"setup_target_path")
54 if not os.path.exists(self.settings["storedir"]+"/builds/"):
55 os.makedirs(self.settings["storedir"]+"/builds/")
57 def copy_files_to_image(self):
58 # copies specific files from the buildroot to merge_path
61 # check for autoresume point
62 if self.settings.has_key("AUTORESUME") \
63 and os.path.exists(self.settings["autoresume_path"]+"copy_files_to_image"):
64 print "Resume point detected, skipping target path setup operation..."
66 if self.settings.has_key("netboot2/packages"):
67 if type(self.settings["netboot2/packages"]) == types.StringType:
68 loopy=[self.settings["netboot2/packages"]]
70 loopy=self.settings["netboot2/packages"]
73 if self.settings.has_key("netboot2/packages/"+x+"/files"):
74 if type(self.settings["netboot2/packages/"+x+"/files"]) == types.ListType:
75 myfiles.extend(self.settings["netboot2/packages/"+x+"/files"])
77 myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
79 if self.settings.has_key("netboot2/extra_files"):
80 if type(self.settings["netboot2/extra_files"]) == types.ListType:
81 myfiles.extend(self.settings["netboot2/extra_files"])
83 myfiles.append(self.settings["netboot2/extra_files"])
86 cmd("/bin/bash "+self.settings["controller_file"]+\
87 " image " + list_bashify(myfiles),env=self.env)
90 raise CatalystError,"Failed to copy files to image!"
92 touch(self.settings["autoresume_path"]+"copy_files_to_image")
94 def setup_overlay(self):
95 if self.settings.has_key("AUTORESUME") \
96 and os.path.exists(self.settings["autoresume_path"]+"setup_overlay"):
97 print "Resume point detected, skipping setup_overlay operation..."
99 if self.settings.has_key("netboot2/overlay"):
100 for x in self.settings["netboot2/overlay"]:
101 if os.path.exists(x):
102 cmd("rsync -a "+x+"/ "+\
103 self.settings["chroot_path"] + self.settings["merge_path"], "netboot2/overlay: "+x+" copy failed.",env=self.env)
104 touch(self.settings["autoresume_path"]+"setup_overlay")
106 def move_kernels(self):
107 # we're done, move the kernels to builds/*
108 # no auto resume here as we always want the
109 # freshest images moved
111 cmd("/bin/bash "+self.settings["controller_file"]+\
112 " final",env=self.env)
113 print ">>> Netboot Build Finished!"
114 except CatalystError:
116 raise CatalystError,"Failed to move kernel images!"
119 if self.settings.has_key("AUTORESUME") \
120 and os.path.exists(self.settings["autoresume_path"]+"remove"):
121 print "Resume point detected, skipping remove operation..."
123 if self.settings.has_key(self.settings["spec_prefix"]+"/rm"):
124 for x in self.settings[self.settings["spec_prefix"]+"/rm"]:
125 # we're going to shell out for all these cleaning operations,
126 # so we get easy glob handling
127 print "netboot2: removing " + x
128 os.system("rm -rf " + self.settings["chroot_path"] + self.settings["merge_path"] + x)
131 if self.settings.has_key("AUTORESUME") \
132 and os.path.exists(self.settings["autoresume_path"]+"empty"):
133 print "Resume point detected, skipping empty operation..."
135 if self.settings.has_key("netboot2/empty"):
136 if type(self.settings["netboot2/empty"])==types.StringType:
137 self.settings["netboot2/empty"]=self.settings["netboot2/empty"].split()
138 for x in self.settings["netboot2/empty"]:
139 myemp=self.settings["chroot_path"] + self.settings["merge_path"] + x
140 if not os.path.isdir(myemp):
141 print x,"not a directory or does not exist, skipping 'empty' operation."
143 print "Emptying directory", x
144 # stat the dir, delete the dir, recreate the dir and set
145 # the proper perms and ownership
146 mystat=os.stat(myemp)
148 os.makedirs(myemp,0755)
149 os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
150 os.chmod(myemp,mystat[ST_MODE])
151 touch(self.settings["autoresume_path"]+"empty")
153 def set_action_sequence(self):
154 self.settings["action_sequence"]=["unpack","unpack_snapshot","config_profile_link",
155 "setup_confdir","portage_overlay","bind","chroot_setup",\
156 "setup_environment","build_packages","root_overlay",\
157 "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
158 "remove","empty","unbind","clean","clear_autoresume"]
161 foo.update({"netboot2":netboot2_target})