Fix broken "preserve_libs" commit - ";" is not ":".
[catalyst.git] / modules / netboot2_target.py
index 761764ac5b8503362a6e33a8ef549252db1c6a48..1ab7e7da5980f2ce3c90b2077c0e5e8166717667 100644 (file)
@@ -1,59 +1,51 @@
-# Copyright 1999-2005 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo/src/catalyst/modules/netboot2_target.py,v 1.1 2006/01/13 15:09:07 rocket 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.valid_values = [
-                       "netboot2/extra_files",
-               ]
                self.required_values=[
-                       "boot/kernel",
-                       "netboot2/builddate",
-                       "netboot2/busybox_config",
-                       "netboot2/packages"                     
+                       "boot/kernel"
                ]
-                       
+               self.valid_values=self.required_values[:]
+               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:
                                        loopy=addlargs["netboot2/packages"]
+
+                               for x in loopy:
+                                       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(addlargs)
-
-               # Merge packages into the buildroot, and pick out certain files to place in
-               # /tmp/image
-               self.settings["merge_path"]=normpath("/tmp/image")
-
-               for envvar in "CFLAGS", "CXXFLAGS":
-                       if not os.environ.has_key(envvar) and not addlargs.has_key(envvar):
-                               self.settings[envvar] = "-Os -pipe"
-
-       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.set_build_kernel_vars()
+               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:
@@ -71,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:
@@ -103,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/*
@@ -116,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})