Fix broken "preserve_libs" commit - ";" is not ":".
[catalyst.git] / modules / netboot2_target.py
index d92861336bac015d7c005fb037601aaa07da232e..1ab7e7da5980f2ce3c90b2077c0e5e8166717667 100644 (file)
@@ -1,27 +1,33 @@
-# $Header: /var/cvsroot/gentoo/src/catalyst/modules/netboot2_target.py,v 1.4 2006/10/02 20:41:54 wolf31o2 Exp $
-
 """
-Builder class for a netboot build, version 2
+netboot target, version 2
 """
+# NOTE: That^^ docstring has influence catalyst-spec(5) man page generation.
 
 import os,string,types
 from catalyst_support import *
 from generic_stage_target import *
 
 class netboot2_target(generic_stage_target):
+       """
+       Builder class for a netboot build, version 2
+       """
        def __init__(self,spec,addlargs):
                self.required_values=[
-                       "boot/kernel",
-                       "netboot2/builddate",
-                       "netboot2/packages",                    
-                       "netboot2/use"                  
+                       "boot/kernel"
                ]
                self.valid_values=self.required_values[:]
-               self.valid_values.extend(self.required_values)
-               self.valid_values.extend(["netboot2/extra_files"])
-                       
+               self.valid_values.extend([
+                       "netboot2/packages",
+                       "netboot2/use",
+                       "netboot2/extra_files",
+                       "netboot2/overlay",
+                       "netboot2/busybox_config",
+                       "netboot2/root_overlay",
+                       "netboot2/linuxrc"
+               ])
+
                try:
-                       if addlargs.has_key("netboot2/packages"):
+                       if "netboot2/packages" in addlargs:
                                if type(addlargs["netboot2/packages"]) == types.StringType:
                                        loopy=[addlargs["netboot2/packages"]]
                                else:
@@ -31,26 +37,15 @@ class netboot2_target(generic_stage_target):
                                        self.valid_values.append("netboot2/packages/"+x+"/files")
                except:
                        raise CatalystError,"configuration error in netboot2/packages."
-               
-               
 
                generic_stage_target.__init__(self,spec,addlargs)
                self.set_build_kernel_vars()
-
-               # Merge packages into the buildroot, and pick out certain files to place in
-               # /tmp/image
-               self.settings["merge_path"]=normpath("/tmp/image")
-
-       def set_dest_path(self):
-               if self.settings.has_key("merge_path"):
-                       self.settings["destpath"]=normpath(self.settings["chroot_path"]+self.settings["merge_path"])
-               else:
-                       self.settings["destpath"]=normpath(self.settings["chroot_path"])
+               self.settings["merge_path"]=normpath("/tmp/image/")
 
        def set_target_path(self):
                self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+\
                        self.settings["target_subpath"]+"/")
-               if self.settings.has_key("AUTORESUME") \
+               if "AUTORESUME" in self.settings \
                        and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"):
                                print "Resume point detected, skipping target path setup operation..."
                else:
@@ -68,24 +63,24 @@ class netboot2_target(generic_stage_target):
                myfiles=[]
 
                # check for autoresume point
-               if self.settings.has_key("AUTORESUME") \
+               if "AUTORESUME" in self.settings \
                        and os.path.exists(self.settings["autoresume_path"]+"copy_files_to_image"):
                                print "Resume point detected, skipping target path setup operation..."
                else:
-                       if self.settings.has_key("netboot2/packages"):
+                       if "netboot2/packages" in self.settings:
                                if type(self.settings["netboot2/packages"]) == types.StringType:
                                        loopy=[self.settings["netboot2/packages"]]
                                else:
                                        loopy=self.settings["netboot2/packages"]
-               
+
                        for x in loopy:
-                               if self.settings.has_key("netboot2/packages/"+x+"/files"):
+                               if "netboot2/packages/"+x+"/files" in self.settings:
                                    if type(self.settings["netboot2/packages/"+x+"/files"]) == types.ListType:
                                            myfiles.extend(self.settings["netboot2/packages/"+x+"/files"])
                                    else:
                                            myfiles.append(self.settings["netboot2/packages/"+x+"/files"])
 
-                       if self.settings.has_key("netboot2/extra_files"):
+                       if "netboot2/extra_files" in self.settings:
                                if type(self.settings["netboot2/extra_files"]) == types.ListType:
                                        myfiles.extend(self.settings["netboot2/extra_files"])
                                else:
@@ -100,6 +95,17 @@ class netboot2_target(generic_stage_target):
 
                        touch(self.settings["autoresume_path"]+"copy_files_to_image")
 
+       def setup_overlay(self):
+               if "AUTORESUME" in self.settings \
+               and os.path.exists(self.settings["autoresume_path"]+"setup_overlay"):
+                       print "Resume point detected, skipping setup_overlay operation..."
+               else:
+                       if "netboot2/overlay" in self.settings:
+                               for x in self.settings["netboot2/overlay"]:
+                                       if os.path.exists(x):
+                                               cmd("rsync -a "+x+"/ "+\
+                                                       self.settings["chroot_path"] + self.settings["merge_path"], "netboot2/overlay: "+x+" copy failed.",env=self.env)
+                               touch(self.settings["autoresume_path"]+"setup_overlay")
 
        def move_kernels(self):
                # we're done, move the kernels to builds/*
@@ -113,13 +119,47 @@ class netboot2_target(generic_stage_target):
                        self.unbind()
                        raise CatalystError,"Failed to move kernel images!"
 
+       def remove(self):
+               if "AUTORESUME" in self.settings \
+                       and os.path.exists(self.settings["autoresume_path"]+"remove"):
+                       print "Resume point detected, skipping remove operation..."
+               else:
+                       if self.settings["spec_prefix"]+"/rm" in self.settings:
+                               for x in self.settings[self.settings["spec_prefix"]+"/rm"]:
+                                       # we're going to shell out for all these cleaning operations,
+                                       # so we get easy glob handling
+                                       print "netboot2: removing " + x
+                                       os.system("rm -rf " + self.settings["chroot_path"] + self.settings["merge_path"] + x)
+
+       def empty(self):
+               if "AUTORESUME" in self.settings \
+                       and os.path.exists(self.settings["autoresume_path"]+"empty"):
+                       print "Resume point detected, skipping empty operation..."
+               else:
+                       if "netboot2/empty" in self.settings:
+                               if type(self.settings["netboot2/empty"])==types.StringType:
+                                       self.settings["netboot2/empty"]=self.settings["netboot2/empty"].split()
+                               for x in self.settings["netboot2/empty"]:
+                                       myemp=self.settings["chroot_path"] + self.settings["merge_path"] + x
+                                       if not os.path.isdir(myemp):
+                                               print x,"not a directory or does not exist, skipping 'empty' operation."
+                                               continue
+                                       print "Emptying directory", x
+                                       # stat the dir, delete the dir, recreate the dir and set
+                                       # the proper perms and ownership
+                                       mystat=os.stat(myemp)
+                                       shutil.rmtree(myemp)
+                                       os.makedirs(myemp,0755)
+                                       os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
+                                       os.chmod(myemp,mystat[ST_MODE])
+               touch(self.settings["autoresume_path"]+"empty")
 
        def set_action_sequence(self):
            self.settings["action_sequence"]=["unpack","unpack_snapshot","config_profile_link",
-                                       "setup_confdir","bind","chroot_setup",\
+                                       "setup_confdir","portage_overlay","bind","chroot_setup",\
                                        "setup_environment","build_packages","root_overlay",\
-                                       "copy_files_to_image","build_kernel","move_kernels",\
-                                       "unbind","clean","clear_autoresume"]
+                                       "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
+                                       "remove","empty","unbind","clean","clear_autoresume"]
 
 def register(foo):
        foo.update({"netboot2":netboot2_target})