cleanup long lines, improve usage() output formatting slightly
[catalyst.git] / catalyst / modules / netboot2_target.py
1 """
2 netboot target, version 2
3 """
4 # NOTE: That^^ docstring has influence catalyst-spec(5) man page generation.
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         """
12         Builder class for a netboot build, version 2
13         """
14         def __init__(self,spec,addlargs):
15                 self.required_values=[
16                         "boot/kernel"
17                 ]
18                 self.valid_values=self.required_values[:]
19                 self.valid_values.extend([
20                         "netboot2/packages",
21                         "netboot2/use",
22                         "netboot2/extra_files",
23                         "netboot2/overlay",
24                         "netboot2/busybox_config",
25                         "netboot2/root_overlay",
26                         "netboot2/linuxrc"
27                 ])
28
29                 try:
30                         if "netboot2/packages" in addlargs:
31                                 if type(addlargs["netboot2/packages"]) == types.StringType:
32                                         loopy=[addlargs["netboot2/packages"]]
33                                 else:
34                                         loopy=addlargs["netboot2/packages"]
35
36                                 for x in loopy:
37                                         self.valid_values.append("netboot2/packages/"+x+"/files")
38                 except:
39                         raise CatalystError,"configuration error in netboot2/packages."
40
41                 generic_stage_target.__init__(self,spec,addlargs)
42                 self.set_build_kernel_vars()
43                 self.settings["merge_path"]=normpath("/tmp/image/")
44
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..."
51                 else:
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")
57
58                 if not os.path.exists(self.settings["storedir"]+"/builds/"):
59                         os.makedirs(self.settings["storedir"]+"/builds/")
60
61         def copy_files_to_image(self):
62                 # copies specific files from the buildroot to merge_path
63                 myfiles=[]
64
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..."
69                 else:
70                         if "netboot2/packages" in self.settings:
71                                 if type(self.settings["netboot2/packages"]) == types.StringType:
72                                         loopy=[self.settings["netboot2/packages"]]
73                                 else:
74                                         loopy=self.settings["netboot2/packages"]
75
76                         for x in loopy:
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"])
80                                     else:
81                                             myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
82
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"])
86                                 else:
87                                         myfiles.append(self.settings["netboot2/extra_files"])
88
89                         try:
90                                 cmd("/bin/bash "+self.settings["controller_file"]+\
91                                         " image " + list_bashify(myfiles),env=self.env)
92                         except CatalystError:
93                                 self.unbind()
94                                 raise CatalystError,"Failed to copy files to image!"
95
96                         touch(self.settings["autoresume_path"]+"copy_files_to_image")
97
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..."
102                 else:
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")
109
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
114                 try:
115                         cmd("/bin/bash "+self.settings["controller_file"]+\
116                                 " final",env=self.env)
117                         print ">>> Netboot Build Finished!"
118                 except CatalystError:
119                         self.unbind()
120                         raise CatalystError,"Failed to move kernel images!"
121
122         def remove(self):
123                 if "AUTORESUME" in self.settings \
124                         and os.path.exists(self.settings["autoresume_path"]+"remove"):
125                         print "Resume point detected, skipping remove operation..."
126                 else:
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)
133
134         def empty(self):
135                 if "AUTORESUME" in self.settings \
136                         and os.path.exists(self.settings["autoresume_path"]+"empty"):
137                         print "Resume point detected, skipping empty operation..."
138                 else:
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."
146                                                 continue
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)
151                                         shutil.rmtree(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")
156
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"]
163
164 def register(foo):
165         foo.update({"netboot2":netboot2_target})
166         return foo