2 netboot target, version 2
4 # NOTE: That^^ docstring has influence catalyst-spec(5) man page generation.
7 from catalyst_support import *
8 from generic_stage_target import *
10 class netboot2_target(generic_stage_target):
12 Builder class for a netboot build, version 2
14 def __init__(self,spec,addlargs):
15 self.required_values=[
18 self.valid_values=self.required_values[:]
19 self.valid_values.extend([
22 "netboot2/extra_files",
24 "netboot2/busybox_config",
25 "netboot2/root_overlay",
30 if "netboot2/packages" in addlargs:
31 if type(addlargs["netboot2/packages"]) == types.StringType:
32 loopy=[addlargs["netboot2/packages"]]
34 loopy=addlargs["netboot2/packages"]
37 self.valid_values.append("netboot2/packages/"+x+"/files")
39 raise CatalystError,"configuration error in netboot2/packages."
41 generic_stage_target.__init__(self,spec,addlargs)
42 self.set_build_kernel_vars()
43 self.settings["merge_path"]=normpath("/tmp/image/")
45 def set_target_path(self):
46 self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+\
47 self.settings["target_subpath"]+"/")
48 if "AUTORESUME" in self.settings \
49 and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"):
50 print "Resume point detected, skipping target path setup operation..."
52 # first clean up any existing target stuff
53 if os.path.isfile(self.settings["target_path"]):
54 cmd("rm -f "+self.settings["target_path"], \
55 "Could not remove existing file: "+self.settings["target_path"],env=self.env)
56 touch(self.settings["autoresume_path"]+"setup_target_path")
58 if not os.path.exists(self.settings["storedir"]+"/builds/"):
59 os.makedirs(self.settings["storedir"]+"/builds/")
61 def copy_files_to_image(self):
62 # copies specific files from the buildroot to merge_path
65 # check for autoresume point
66 if "AUTORESUME" in self.settings \
67 and os.path.exists(self.settings["autoresume_path"]+"copy_files_to_image"):
68 print "Resume point detected, skipping target path setup operation..."
70 if "netboot2/packages" in self.settings:
71 if type(self.settings["netboot2/packages"]) == types.StringType:
72 loopy=[self.settings["netboot2/packages"]]
74 loopy=self.settings["netboot2/packages"]
77 if "netboot2/packages/"+x+"/files" in self.settings:
78 if type(self.settings["netboot2/packages/"+x+"/files"]) == types.ListType:
79 myfiles.extend(self.settings["netboot2/packages/"+x+"/files"])
81 myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
83 if "netboot2/extra_files" in self.settings:
84 if type(self.settings["netboot2/extra_files"]) == types.ListType:
85 myfiles.extend(self.settings["netboot2/extra_files"])
87 myfiles.append(self.settings["netboot2/extra_files"])
90 cmd("/bin/bash "+self.settings["controller_file"]+\
91 " image " + list_bashify(myfiles),env=self.env)
94 raise CatalystError,"Failed to copy files to image!"
96 touch(self.settings["autoresume_path"]+"copy_files_to_image")
98 def setup_overlay(self):
99 if "AUTORESUME" in self.settings \
100 and os.path.exists(self.settings["autoresume_path"]+"setup_overlay"):
101 print "Resume point detected, skipping setup_overlay operation..."
103 if "netboot2/overlay" in self.settings:
104 for x in self.settings["netboot2/overlay"]:
105 if os.path.exists(x):
106 cmd("rsync -a "+x+"/ "+\
107 self.settings["chroot_path"] + self.settings["merge_path"], "netboot2/overlay: "+x+" copy failed.",env=self.env)
108 touch(self.settings["autoresume_path"]+"setup_overlay")
110 def move_kernels(self):
111 # we're done, move the kernels to builds/*
112 # no auto resume here as we always want the
113 # freshest images moved
115 cmd("/bin/bash "+self.settings["controller_file"]+\
116 " final",env=self.env)
117 print ">>> Netboot Build Finished!"
118 except CatalystError:
120 raise CatalystError,"Failed to move kernel images!"
123 if "AUTORESUME" in self.settings \
124 and os.path.exists(self.settings["autoresume_path"]+"remove"):
125 print "Resume point detected, skipping remove operation..."
127 if self.settings["spec_prefix"]+"/rm" in self.settings:
128 for x in self.settings[self.settings["spec_prefix"]+"/rm"]:
129 # we're going to shell out for all these cleaning operations,
130 # so we get easy glob handling
131 print "netboot2: removing " + x
132 os.system("rm -rf " + self.settings["chroot_path"] + self.settings["merge_path"] + x)
135 if "AUTORESUME" in self.settings \
136 and os.path.exists(self.settings["autoresume_path"]+"empty"):
137 print "Resume point detected, skipping empty operation..."
139 if "netboot2/empty" in self.settings:
140 if type(self.settings["netboot2/empty"])==types.StringType:
141 self.settings["netboot2/empty"]=self.settings["netboot2/empty"].split()
142 for x in self.settings["netboot2/empty"]:
143 myemp=self.settings["chroot_path"] + self.settings["merge_path"] + x
144 if not os.path.isdir(myemp):
145 print x,"not a directory or does not exist, skipping 'empty' operation."
147 print "Emptying directory", x
148 # stat the dir, delete the dir, recreate the dir and set
149 # the proper perms and ownership
150 mystat=os.stat(myemp)
152 os.makedirs(myemp,0755)
153 os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
154 os.chmod(myemp,mystat[ST_MODE])
155 touch(self.settings["autoresume_path"]+"empty")
157 def set_action_sequence(self):
158 self.settings["action_sequence"]=["unpack","unpack_snapshot","config_profile_link",
159 "setup_confdir","portage_overlay","bind","chroot_setup",\
160 "setup_environment","build_packages","root_overlay",\
161 "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
162 "remove","empty","unbind","clean","clear_autoresume"]
165 foo.update({"netboot2":netboot2_target})