Replace content on master with content from catalyst_2
[catalyst.git] / modules / netboot2_target.py
1
2 """
3 Builder class for a netboot build, version 2
4 """
5
6 import os,string,types
7 from catalyst_support import *
8 from generic_stage_target import *
9
10 class netboot2_target(generic_stage_target):
11         def __init__(self,spec,addlargs):
12                 self.required_values=[
13                         "boot/kernel"
14                 ]
15                 self.valid_values=self.required_values[:]
16                 self.valid_values.extend([
17                         "netboot2/packages",
18                         "netboot2/use",
19                         "netboot2/extra_files",
20                         "netboot2/overlay",
21                         "netboot2/busybox_config",
22                         "netboot2/root_overlay",
23                         "netboot2/linuxrc"
24                 ])
25
26                 try:
27                         if addlargs.has_key("netboot2/packages"):
28                                 if type(addlargs["netboot2/packages"]) == types.StringType:
29                                         loopy=[addlargs["netboot2/packages"]]
30                                 else:
31                                         loopy=addlargs["netboot2/packages"]
32
33                                 for x in loopy:
34                                         self.valid_values.append("netboot2/packages/"+x+"/files")
35                 except:
36                         raise CatalystError,"configuration error in netboot2/packages."
37                 
38                 generic_stage_target.__init__(self,spec,addlargs)
39                 self.set_build_kernel_vars()
40                 self.settings["merge_path"]=normpath("/tmp/image/")
41
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..."
48                 else:
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")
54
55                 if not os.path.exists(self.settings["storedir"]+"/builds/"):
56                         os.makedirs(self.settings["storedir"]+"/builds/")
57
58         def copy_files_to_image(self):
59                 # copies specific files from the buildroot to merge_path
60                 myfiles=[]
61
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..."
66                 else:
67                         if self.settings.has_key("netboot2/packages"):
68                                 if type(self.settings["netboot2/packages"]) == types.StringType:
69                                         loopy=[self.settings["netboot2/packages"]]
70                                 else:
71                                         loopy=self.settings["netboot2/packages"]
72                 
73                         for x in loopy:
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"])
77                                     else:
78                                             myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
79
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"])
83                                 else:
84                                         myfiles.append(self.settings["netboot2/extra_files"])
85
86                         try:
87                                 cmd("/bin/bash "+self.settings["controller_file"]+\
88                                         " image " + list_bashify(myfiles),env=self.env)
89                         except CatalystError:
90                                 self.unbind()
91                                 raise CatalystError,"Failed to copy files to image!"
92
93                         touch(self.settings["autoresume_path"]+"copy_files_to_image")
94
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..."
99                 else:
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")
106
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
111                 try:
112                         cmd("/bin/bash "+self.settings["controller_file"]+\
113                                 " final",env=self.env)
114                         print ">>> Netboot Build Finished!"
115                 except CatalystError:
116                         self.unbind()
117                         raise CatalystError,"Failed to move kernel images!"
118
119         def remove(self):
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..."
123                 else:
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)
130
131         def empty(self):                
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..."
135                 else:
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."
143                                                 continue
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)
148                                         shutil.rmtree(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")
153
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"]
160
161 def register(foo):
162         foo.update({"netboot2":netboot2_target})
163         return foo