X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=catalyst;h=4b48587af53dc4a397786860f3a65a64d5bdc4ea;hb=8621e56be3b8b9db1233647d2eec0152deb06da4;hp=11b52d90891f56bc287d85a5e468d8d9a576cbe4;hpb=6151f0b0db71c490e1bdcd7b6f99c57de45a77ce;p=catalyst.git diff --git a/catalyst b/catalyst index 11b52d90..4b48587a 100755 --- a/catalyst +++ b/catalyst @@ -1,27 +1,27 @@ #!/usr/bin/python -OO # Maintained in full by: +# Catalyst Team +# Release Engineering Team # Andrew Gaffney # Chris Gianelloni # $Id$ -import os, sys, getopt +import os, sys, imp, string, getopt +import pdb +import os.path -# This assumes that our modules are in a sub-dir named "modules" in the -# directory that the main catalyst binary is in __selfpath__ = os.path.abspath(os.path.dirname(__file__)) + sys.path.append(__selfpath__ + "/modules") -import catalyst -from catalyst.output import * -from catalyst.error import * -from catalyst.hash import hash_map +import catalyst.config +import catalyst.util -__maintainer__="Chris Gianelloni " -__version__="2.99" +__maintainer__="Catalyst " +__version__="2.0.13" -conf_values = {} -config = catalyst.config.config() +conf_values={} def usage(): print "Usage catalyst [options] [-C variable=value...] [ -s identifier]" @@ -34,6 +34,7 @@ def usage(): 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" @@ -49,140 +50,203 @@ def usage(): print "Using the specfile option (-f, --file) to build a stage target:" print "catalyst -f stage1-specfile.spec" -def show_version(): - msg("Catalyst, version " + __version__) - msg("Copyright 2003-2008 Gentoo Foundation") - msg("Copyright 2008 various authors") - msg("Distributed under the GNU General Public License version 2.1") +def version(): + print "Catalyst, version "+__version__ + print "Copyright 2003-2008 Gentoo Foundation" + print "Copyright 2008-2012 various authors" + print "Distributed under the GNU General Public License version 2.1\n" -def parse_config(): +def parse_config(myconfig): # search a couple of different areas for the main config file - myconf = {} - - 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" - } + 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"} # first, try the one passed (presumably from the cmdline) - if "config_file" in conf_values: - if os.path.exists(conf_values["config_file"]): - msg("Using command line specified Catalyst configuration file, " + conf_values["config_file"]) + if myconfig: + if os.path.exists(myconfig): + print "Using command line specified Catalyst configuration file, "+myconfig + config_file=myconfig + else: - die("specified configuration file " + conf_values["config_file"] + " does not exist") + 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"): - msg("Using default Catalyst configuration file, /etc/catalyst/catalyst.conf") - conf_values["config_file"] = "/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: - die("Could not find a suitable configuration file") - - # Load the default config values into myconf - for x in confdefaults: - msg("Setting " + x + " to default value '" + confdefaults[x] + "'") - myconf[x] = confdefaults[x] + print "!!! catalyst: Could not find a suitable configuration file" + sys.exit(1) # now, try and parse the config file "config_file" try: - myconfig = catalyst.config.ConfigParser(conf_values["config_file"]) +# execfile(config_file, myconf, myconf) + myconfig = catalyst.config.ConfigParser(config_file) myconf.update(myconfig.get_values()) except: - die("Unable to parse configuration file, " + conf_values["config_file"]) + 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 x in myconf: - msg("Setting " + x + " to config file value '" + myconf[x] + "'") - conf_values[x] = myconf[x] + print "Setting",x,"to config file value \""+myconf[x]+"\"" + conf_values[x]=myconf[x] else: - msg("Setting " + x + " to default value '" + confdefaults[x] + "'") - conf_values[x] = confdefaults[x] - - options = ( - ("autoresume", "AUTORESUME", "Autoresuming support enabled."), - ("ccache", "CCACHE", "Compiler cache support enabled."), - ("clear-autoresume", "CLEAR_AUTORESUME", "Cleaning autoresume flags support enabled"), -# ("compress", "COMPRESS", "Compression enabled."), - ("distcc", "DISTCC", "Distcc support enabled."), - ("icecream", "ICECREAM", "Icecream compiler cluster support enabled."), - ("kerncache", "KERNCACHE", "Kernel cache support enabled."), - ("pkgcache", "PKGCACHE", "Package cache support enabled."), - ("purge", "PURGE", "Purge support enabled."), - ("seedcache", "SEEDCACHE", "Seed cache support enabled."), - ("snapcache", "SNAPCACHE", "Snapshot cache support enabled."), -# ("tarball", "TARBALL", "Tarball creation enabled.") - ) - - split_options = conf_values["options"].split() + print "Setting",x,"to default value \""+confdefaults[x]+"\"" + conf_values[x]=confdefaults[x] # parse out the rest of the options from the config file - for x in options: - if x[0] in split_options: - msg(x[2]) - conf_values[x[1]] = "1" + if "autoresume" in string.split(conf_values["options"]): + print "Autoresuming support enabled." + conf_values["AUTORESUME"]="1" - if "digests" in myconf: - conf_values["digests"] = myconf["digests"] + 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" + + if "clear-autoresume" in string.split(conf_values["options"]): + 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" + + if "icecream" in string.split(conf_values["options"]): + print "Icecream compiler cluster support enabled." + conf_values["ICECREAM"]="1" + + if "kerncache" in string.split(conf_values["options"]): + print "Kernel cache support enabled." + conf_values["KERNCACHE"]="1" + + if "pkgcache" in string.split(conf_values["options"]): + 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" + + if "seedcache" in string.split(conf_values["options"]): + print "Seed cache support enabled." + conf_values["SEEDCACHE"]="1" + if "snapcache" in string.split(conf_values["options"]): + 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 "digests" in myconf: + conf_values["digests"]=myconf["digests"] if "contents" in myconf: - conf_values["contents"] = myconf["contents"] + conf_values["contents"]=myconf["contents"] if "envscript" in myconf: - msg("Envscript support enabled.") - conf_values["ENVSCRIPT"] = myconf["envscript"] + print "Envscript support enabled." + conf_values["ENVSCRIPT"]=myconf["envscript"] -def verify_digest_and_hash_functions(): - # Start checking that digests are valid now that the hash_map was imported from catalyst_support - if "digests" in conf_values: - for i in conf_values["digests"].split(): - if not i in hash_map: - msg() - msg(i + " is not a valid digest entry") - msg("Valid digest entries:") - msg("\n".join(hash_map.keys())) - msg() - msg("Catalyst aborting....") - sys.exit(2) - if catalyst.util.find_binary(hash_map[i][1]) == None: - msg() - msg("digest=" + i) - msg("\tThe " + hash_map[i][1] + \ - " binary was not found. It needs to be in your system path") - msg() - msg("Catalyst aborting....") - sys.exit(2) + if "var_tmpfs_portage" in myconf: + conf_values["var_tmpfs_portage"]=myconf["var_tmpfs_portage"]; - if "hash_function" in conf_values: - if not conf_values["hash_function"] in hash_map: - msg() - msg(conf_values["hash_function"] + " is not a valid hash_function entry") - msg("Valid hash_function entries:") - msg("\n".join(hash_map.keys())) - msg() - msg("Catalyst aborting....") - sys.exit(2) - if catalyst.util.find_binary(hash_map[conf_values["hash_function"]][1]) == None: - msg() - msg("hash_function=" + conf_values["hash_function"]) - msg("\tThe " + hash_map[conf_values["hash_function"]][1] + \ - " binary was not found. It needs to be in your system path") - msg() - msg("Catalyst aborting....") - sys.exit(2) + if "port_logdir" in myconf: + conf_values["port_logdir"]=myconf["port_logdir"]; + +def import_modules(): + # import catalyst's own modules (i.e. catalyst_support and the arch modules) + targetmap={} + + try: + for x in required_build_targets: + try: + fh=open(conf_values["sharedir"]+"/modules/"+x+".py") + module=imp.load_module(x,fh,"modules/"+x+".py",(".py","r",imp.PY_SOURCE)) + fh.close() + + except IOError: + raise CatalystError,"Can't find "+x+".py plugin in "+\ + conf_values["sharedir"]+"/modules/" + + for x in valid_build_targets: + try: + fh=open(conf_values["sharedir"]+"/modules/"+x+".py") + module=imp.load_module(x,fh,"modules/"+x+".py",(".py","r",imp.PY_SOURCE)) + module.register(targetmap) + fh.close() + + except IOError: + raise CatalystError,"Can't find "+x+".py plugin in "+\ + conf_values["sharedir"]+"/modules/" + + except ImportError: + print "!!! catalyst: Python modules not found in "+\ + conf_values["sharedir"]+"/modules; exiting." + sys.exit(1) + + return targetmap + +def build_target(addlargs, targetmap): + try: + 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() + 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 + print "!!! catalyst: This script requires root privileges to operate" + sys.exit(2) + + # we need some options in order to work correctly + if len(sys.argv) < 2: + usage() + sys.exit(2) -def parse_commandline(): # parse out the command line arguments try: - opts,args = getopt.getopt(sys.argv[1:], "apPhvdc:C:f:FVs:", ["purge", "purgeonly", "help", "version", "debug",\ + 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: @@ -190,11 +254,17 @@ def parse_commandline(): sys.exit(2) # defaults for commandline opts - conf_values["command_line"] = [] + debug=False + verbose=False + fetch=False + myconfig="" + myspecfile="" + mycmdline=[] + myopts=[] # check preconditions if len(opts) == 0: - warn("please specify one of either -f or -C\n") + print "!!! catalyst: please specify one of either -f or -C\n" usage() sys.exit(2) @@ -205,7 +275,7 @@ def parse_commandline(): sys.exit(1) if o in ("-V", "--version"): - show_version() + print "Catalyst version "+__version__ sys.exit(1) if o in ("-d", "--debug"): @@ -213,34 +283,34 @@ def parse_commandline(): conf_values["VERBOSE"]="1" if o in ("-c", "--config"): - conf_values["config_file"] = a + myconfig=a if o in ("-C", "--cli"): run = True - x = sys.argv.index(o) + 1 + x=sys.argv.index(o)+1 while x < len(sys.argv): - conf_values["command_line"].append(sys.argv[x]) - x = x + 1 + mycmdline.append(sys.argv[x]) + x=x+1 if o in ("-f", "--file"): run = True - conf_values["spec_file"] = a + myspecfile=a if o in ("-F", "--fetchonly"): - conf_values["FETCH"] = "1" + conf_values["FETCH"]="1" if o in ("-v", "--verbose"): - conf_values["VERBOSE"] = "1" + conf_values["VERBOSE"]="1" if o in ("-s", "--snapshot"): if len(sys.argv) < 3: - warn("missing snapshot identifier") + print "!!! catalyst: missing snapshot identifier\n" usage() sys.exit(2) else: run = True - conf_values["command_line"].append("target=snapshot") - conf_values["command_line"].append("version_stamp="+a) + mycmdline.append("target=snapshot") + mycmdline.append("version_stamp="+a) if o in ("-p", "--purge"): conf_values["PURGE"] = "1" @@ -248,74 +318,107 @@ def parse_commandline(): if o in ("-P", "--purgeonly"): conf_values["PURGEONLY"] = "1" + if o in ("-T", "--purgetmponly"): + conf_values["PURGETMPONLY"] = "1" + if o in ("-a", "--clear-autoresume"): conf_values["CLEAR_AUTORESUME"] = "1" if not run: - warn("please specify one of either -f or -C") + print "!!! catalyst: please specify one of either -f or -C\n" usage() sys.exit(2) -if __name__ == "__main__": - - show_version() + # import configuration file and import our main module using those settings + parse_config(myconfig) + sys.path.append(conf_values["sharedir"]+"/modules") + from catalyst_support import * - if os.getuid() != 0: - # catalyst cannot be run as a normal user due to chroots, mounts, etc - die("This script requires root privileges to operate", 2) - - parse_commandline() - - parse_config() + # Start checking that digests are valid now that the hash_map was imported + # from catalyst_support + if "digests" in conf_values: + for i in conf_values["digests"].split(): + if i not in hash_map: + print + print i+" is not a valid digest entry" + print "Valid digest entries:" + print hash_map.keys() + print + print "Catalyst aborting...." + sys.exit(2) + if find_binary(hash_map[i][1]) == None: + print + print "digest="+i + print "\tThe "+hash_map[i][1]+\ + " binary was not found. It needs to be in your system path" + print + print "Catalyst aborting...." + sys.exit(2) + 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" + print "Valid hash_function entries:" + print hash_map.keys() + print + print "Catalyst aborting...." + sys.exit(2) + if find_binary(hash_map[conf_values["hash_function"]][1]) == None: + print + print "hash_function="+conf_values["hash_function"] + print "\tThe "+hash_map[conf_values["hash_function"]][1]+\ + " binary was not found. It needs to be in your system path" + print + print "Catalyst aborting...." + sys.exit(2) - verify_digest_and_hash_functions() + # import the rest of the catalyst modules + targetmap=import_modules() - targetmap = catalyst.target.build_target_map() - spec = catalyst.config.Spec() + addlargs={} - if "spec_file" in conf_values: - specparser = catalyst.config.SpecParser(conf_values["spec_file"]) - spec_values = specparser.get_values() - spec.parse_values(spec_values) + if myspecfile: + spec = catalyst.config.SpecParser(myspecfile) + addlargs.update(spec.get_values()) - if "command_line" in conf_values: + if mycmdline: try: cmdline = catalyst.config.ConfigParser() - cmdline.parse_lines(conf_values["command_line"]) - cmdline_values = cmdline.get_values() - spec.parse_values(cmdline_values) + cmdline.parse_lines(mycmdline) + addlargs.update(cmdline.get_values()) except CatalystError: - die("Could not parse commandline, exiting.") + print "!!! catalyst: Could not parse commandline, exiting." + sys.exit(1) - config.set_spec(spec) - config.set_conf(conf_values) - config.set_targetmap(targetmap) + if "target" not in addlargs: + raise CatalystError, "Required value \"target\" not specified." # everything is setup, so the build is a go try: - catalyst.target.build_targets() + build_target(addlargs, targetmap) except CatalystError: - msg() - msg("Catalyst aborting....") + print + print "Catalyst aborting...." sys.exit(2) - except KeyboardInterrupt: - msg() - msg("Catalyst build aborted due to user interrupt ( Ctrl-C )") - msg() - msg("Catalyst aborting....") + print "\nCatalyst build aborted due to user interrupt ( Ctrl-C )" + print + print "Catalyst aborting...." sys.exit(2) - except LockInUse: - msg("Catalyst aborting....") + print "Catalyst aborting...." sys.exit(2) - except: - msg("Catalyst aborting....") + 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"