modules/generic_stage_target.py: Use 'devpts' as mountmap key.
[catalyst.git] / catalyst
index 96622255d7efa9d1abbc7afb711d7cc3bad9ea68..4ea4248db2c92b1708035bf446f88dfe804f8638 100755 (executable)
--- a/catalyst
+++ b/catalyst
@@ -1,4 +1,4 @@
-#!/usr/bin/python -OO
+#!/usr/bin/python2 -OO
 
 # Maintained in full by:
 # Catalyst Team <catalyst@gentoo.org>
@@ -7,48 +7,50 @@
 # Chris Gianelloni <wolf31o2@wolf31o2.org>
 # $Id$
 
-import os, sys, imp, string, getopt
+import os
+import sys
+import imp
+import string
+import getopt
 import pdb
 import os.path
 
-__selfpath__ = os.path.abspath(os.path.dirname(__file__))
-
-sys.path.append(__selfpath__ + "/modules")
-
-import catalyst.config
-import catalyst.util
+import modules.catalyst.config
+import modules.catalyst.util
 
 __maintainer__="Catalyst <catalyst@gentoo.org>"
-__version__="2.0.12.1"
+__version__="2.0.15"
 
 conf_values={}
 
 def usage():
-       print "Usage catalyst [options] [-C variable=value...] [ -s identifier]"
-       print " -a --clear-autoresume   clear autoresume flags"
-       print " -c --config     use specified configuration file"
-       print " -C --cli        catalyst commandline (MUST BE LAST OPTION)"
-       print " -d --debug      enable debugging"
-       print " -f --file       read specfile"
-       print " -F --fetchonly  fetch files only"
-       print " -h --help       print this help message"
-       print " -p --purge      clear tmp dirs,package cache and autoresume flags"
-       print " -P --purgeonly  clear tmp dirs,package cache and autoresume flags and exit"
-       print " -T --purgetmponly  clear tmp dirs and autoresume flags and exit"
-       print " -s --snapshot   generate a release snapshot"
-       print " -V --version    display version information"
-       print " -v --verbose    verbose output"
-       print
-       print "Usage examples:"
-       print
-       print "Using the commandline option (-C, --cli) to build a Portage snapshot:"
-       print "catalyst -C target=snapshot version_stamp=my_date"
-       print
-       print "Using the snapshot option (-s, --snapshot) to build a release snapshot:"
-       print "catalyst -s 20071121"
-       print
-       print "Using the specfile option (-f, --file) to build a stage target:"
-       print "catalyst -f stage1-specfile.spec"
+       print """Usage catalyst [options] [-C variable=value...] [ -s identifier]
+ -a --clear-autoresume  clear autoresume flags
+ -c --config            use specified configuration file
+ -C --cli               catalyst commandline (MUST BE LAST OPTION)
+ -d --debug             enable debugging
+ -f --file              read specfile
+ -F --fetchonly         fetch files only
+ -h --help              print this help message
+ -p --purge             clear tmp dirs,package cache, autoresume flags
+ -P --purgeonly         clear tmp dirs,package cache, autoresume flags and exit
+ -T --purgetmponly      clear tmp dirs and autoresume flags and exit
+ -s --snapshot          generate a release snapshot
+ -V --version           display version information
+ -v --verbose           verbose output
+
+Usage examples:
+
+Using the commandline option (-C, --cli) to build a Portage snapshot:
+catalyst -C target=snapshot version_stamp=my_date
+
+Using the snapshot option (-s, --snapshot) to build a release snapshot:
+catalyst -s 20071121"
+
+Using the specfile option (-f, --file) to build a stage target:
+catalyst -f stage1-specfile.spec
+"""
+
 
 def version():
        print "Catalyst, version "+__version__
@@ -61,12 +63,19 @@ def parse_config(myconfig):
        myconf={}
        config_file=""
 
-       confdefaults={ "storedir":"/var/tmp/catalyst",\
-               "sharedir":"/usr/share/catalyst","distdir":"/usr/portage/distfiles",\
-               "portdir":"/usr/portage","options":"",\
-               "snapshot_cache":"/var/tmp/catalyst/snapshot_cache",\
-               "hash_function":"crc32"}
-               
+       confdefaults = {
+               "distdir": "/usr/portage/distfiles",
+               "hash_function": "crc32",
+               "options": "",
+               "packagedir": "/usr/portage/packages",
+               "portdir": "/usr/portage",
+               "repo_name": "portage",
+               "sharedir": "/usr/share/catalyst",
+               "snapshot_name": "portage-",
+               "snapshot_cache": "/var/tmp/catalyst/snapshot_cache",
+               "storedir": "/var/tmp/catalyst",
+               }
+
        # first, try the one passed (presumably from the cmdline)
        if myconfig:
                if os.path.exists(myconfig):
@@ -77,12 +86,12 @@ def parse_config(myconfig):
                        print "!!! catalyst: Could not use specified configuration file "+\
                                myconfig
                        sys.exit(1)
-       
+
        # next, try the default location
        elif os.path.exists("/etc/catalyst/catalyst.conf"):
                print "Using default Catalyst configuration file, /etc/catalyst/catalyst.conf"
                config_file="/etc/catalyst/catalyst.conf"
-       
+
        # can't find a config file (we are screwed), so bail out
        else:
                print "!!! catalyst: Could not find a suitable configuration file"
@@ -91,16 +100,16 @@ def parse_config(myconfig):
        # now, try and parse the config file "config_file"
        try:
 #              execfile(config_file, myconf, myconf)
-               myconfig = catalyst.config.ConfigParser(config_file)
+               myconfig = modules.catalyst.config.ConfigParser(config_file)
                myconf.update(myconfig.get_values())
-       
+
        except:
                print "!!! catalyst: Unable to parse configuration file, "+myconfig
                sys.exit(1)
-       
+
        # now, load up the values into conf_values so that we can use them
        for x in confdefaults.keys():
-               if myconf.has_key(x):
+               if x in myconf:
                        print "Setting",x,"to config file value \""+myconf[x]+"\""
                        conf_values[x]=myconf[x]
                else:
@@ -112,6 +121,14 @@ def parse_config(myconfig):
                print "Autoresuming support enabled."
                conf_values["AUTORESUME"]="1"
 
+       if "bindist" in string.split(conf_values["options"]):
+               print "Binary redistribution enabled"
+               conf_values["BINDIST"]="1"
+       else:
+               print "Bindist is not enabled in catalyst.conf"
+               print "Binary redistribution of generated stages/isos may be prohibited by law."
+               print "Please see the use description for bindist on any package you are including."
+
        if "ccache" in string.split(conf_values["options"]):
                print "Compiler cache support enabled."
                conf_values["CCACHE"]="1"
@@ -120,10 +137,6 @@ def parse_config(myconfig):
                print "Cleaning autoresume flags support enabled."
                conf_values["CLEAR_AUTORESUME"]="1"
 
-#      if "compress" in string.split(conf_values["options"]):
-#              print "Compression enabled."
-#              conf_values["COMPRESS"]="1"
-
        if "distcc" in string.split(conf_values["options"]):
                print "Distcc support enabled."
                conf_values["DISTCC"]="1"
@@ -140,6 +153,10 @@ def parse_config(myconfig):
                print "Package cache support enabled."
                conf_values["PKGCACHE"]="1"
 
+       if "preserve_libs" in string.split(conf_values["options"]):
+               print "Preserving libs during unmerge."
+               conf_values["PRESERVE_LIBS"]="1"
+
        if "purge" in string.split(conf_values["options"]):
                print "Purge support enabled."
                conf_values["PURGE"]="1"
@@ -152,23 +169,19 @@ def parse_config(myconfig):
                print "Snapshot cache support enabled."
                conf_values["SNAPCACHE"]="1"
 
-#      if "tarball" in string.split(conf_values["options"]):
-#              print "Tarball creation enabled."
-#              conf_values["TARBALL"]="1"
-
-       if myconf.has_key("digests"):
+       if "digests" in myconf:
                conf_values["digests"]=myconf["digests"]
-       if myconf.has_key("contents"):
+       if "contents" in myconf:
                conf_values["contents"]=myconf["contents"]
 
-       if myconf.has_key("envscript"):
+       if "envscript" in myconf:
                print "Envscript support enabled."
                conf_values["ENVSCRIPT"]=myconf["envscript"]
 
-       if myconf.has_key("var_tmpfs_portage"):
+       if "var_tmpfs_portage" in myconf:
                conf_values["var_tmpfs_portage"]=myconf["var_tmpfs_portage"];
 
-       if myconf.has_key("port_logdir"):
+       if "port_logdir" in myconf:
                conf_values["port_logdir"]=myconf["port_logdir"];
 
 def import_modules():
@@ -206,21 +219,21 @@ def import_modules():
 
 def build_target(addlargs, targetmap):
        try:
-               if not targetmap.has_key(addlargs["target"]):
+               if addlargs["target"] not in targetmap:
                        raise CatalystError,"Target \""+addlargs["target"]+"\" not available."
-               
+
                mytarget=targetmap[addlargs["target"]](conf_values, addlargs)
-       
+
                mytarget.run()
 
        except:
-               catalyst.util.print_traceback()
+               modules.catalyst.util.print_traceback()
                print "!!! catalyst: Error encountered during run of target " + addlargs["target"]
                sys.exit(1)
 
 if __name__ == "__main__":
        targetmap={}
-       
+
        version()
        if os.getuid() != 0:
                # catalyst cannot be run as a normal user due to chroots, mounts, etc
@@ -236,11 +249,11 @@ if __name__ == "__main__":
        try:
                opts,args = getopt.getopt(sys.argv[1:], "apPThvdc:C:f:FVs:", ["purge", "purgeonly", "purgetmponly", "help", "version", "debug",\
                        "clear-autoresume", "config=", "cli=", "file=", "fetch", "verbose","snapshot="])
-       
+
        except getopt.GetoptError:
                usage()
                sys.exit(2)
-       
+
        # defaults for commandline opts
        debug=False
        verbose=False
@@ -261,7 +274,7 @@ if __name__ == "__main__":
                if o in ("-h", "--help"):
                        usage()
                        sys.exit(1)
-               
+
                if o in ("-V", "--version"):
                        print "Catalyst version "+__version__
                        sys.exit(1)
@@ -279,14 +292,14 @@ if __name__ == "__main__":
                        while x < len(sys.argv):
                                mycmdline.append(sys.argv[x])
                                x=x+1
-                       
+
                if o in ("-f", "--file"):
                        run = True
                        myspecfile=a
 
                if o in ("-F", "--fetchonly"):
                        conf_values["FETCH"]="1"
-                       
+
                if o in ("-v", "--verbose"):
                        conf_values["VERBOSE"]="1"
 
@@ -299,7 +312,7 @@ if __name__ == "__main__":
                                run = True
                                mycmdline.append("target=snapshot")
                                mycmdline.append("version_stamp="+a)
-               
+
                if o in ("-p", "--purge"):
                        conf_values["PURGE"] = "1"
 
@@ -321,12 +334,12 @@ if __name__ == "__main__":
        parse_config(myconfig)
        sys.path.append(conf_values["sharedir"]+"/modules")
        from catalyst_support import *
-       
+
        # Start checking that digests are valid now that the hash_map was imported
        # from catalyst_support
-       if conf_values.has_key("digests"):
+       if "digests" in conf_values:
                for i in conf_values["digests"].split():
-                       if not hash_map.has_key(i):
+                       if i not in hash_map:
                                print
                                print i+" is not a valid digest entry"
                                print "Valid digest entries:"
@@ -342,8 +355,8 @@ if __name__ == "__main__":
                                print
                                print "Catalyst aborting...."
                                sys.exit(2)
-       if conf_values.has_key("hash_function"):
-               if not hash_map.has_key(conf_values["hash_function"]):
+       if "hash_function" in conf_values:
+               if conf_values["hash_function"] not in hash_map:
                        print
                        print conf_values["hash_function"]+\
                                " is not a valid hash_function entry"
@@ -365,27 +378,27 @@ if __name__ == "__main__":
        targetmap=import_modules()
 
        addlargs={}
-       
+
        if myspecfile:
-               spec = catalyst.config.SpecParser(myspecfile)
+               spec = modules.catalyst.config.SpecParser(myspecfile)
                addlargs.update(spec.get_values())
-       
+
        if mycmdline:
                try:
-                       cmdline = catalyst.config.ConfigParser()
+                       cmdline = modules.catalyst.config.ConfigParser()
                        cmdline.parse_lines(mycmdline)
                        addlargs.update(cmdline.get_values())
                except CatalystError:
                        print "!!! catalyst: Could not parse commandline, exiting."
                        sys.exit(1)
 
-       if not addlargs.has_key("target"):
+       if "target" not in addlargs:
                raise CatalystError, "Required value \"target\" not specified."
 
        # everything is setup, so the build is a go
        try:
                build_target(addlargs, targetmap)
-                       
+
        except CatalystError:
                print
                print "Catalyst aborting...."
@@ -402,20 +415,3 @@ if __name__ == "__main__":
                print "Catalyst aborting...."
                raise
                sys.exit(2)
-
-       #except CatalystError:
-       #       print
-       #       print "Catalyst aborting...."
-       #       sys.exit(2)
-       #except KeyError:
-       #       print "\nproblem with command line or spec file ( Key Error )"
-       #       print "Key: "+str(sys.exc_value)+" was not found"
-       #       print "Catalyst aborting...."
-       #       sys.exit(2)
-       #except UnboundLocalError:
-       #       print
-       #       print "UnboundLocalError: "+str(sys.exc_value)+" was not found"
-       #       raise
-       #       print
-       #       print "Catalyst aborting...."
-       #       sys.exit(2)