diff -r 000000000000 -r 2e8eeb919028 configurationengine/source/scripts/cone_common.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configurationengine/source/scripts/cone_common.py Thu Mar 11 17:04:37 2010 +0200 @@ -0,0 +1,283 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +#!/usr/bin/env python +## +# @author Teemu Rytkonen + +import os +import sys +import logging +import logging.config +import re, fnmatch +from optparse import Option +import cone_tool + + +""" +try to import cone and modify the sys.paths if it does not succeed. +This is done mainly for local installation and testing purposes. +""" +ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) + +try: + from cone.public import api, settings +except ImportError: + sys.path.append(os.path.join(ROOT_PATH)) + sys.path.append(os.path.join(ROOT_PATH,'..')) + from cone.public import api, settings + +# Common command line options used by all sub-actions +COMMON_OPTIONS = [ + Option("--print-settings", + dest="print_settings", + action="store_true", + help="Print all the default settings from the current setting container.", + default=False), + + Option("--print-supported-impls", + action="store_true", + help="Print all supported ImplML XML namespaces and file extensions.", + default=False), + + Option("--print-runtime-info", + action="store_true", + help="Print runtime information about ConE.", + default=False), + + Option("-v", "--verbose",\ + dest="verbose",\ + help="""Print error, warning and information on system out. + Possible choices: Default is 3. + NONE (all) 0 + CRITICAL 1 + ERROR 2 + WARNING 3 + INFO 4 + DEBUG 5""", + metavar="LEVEL", + default="3"), + + Option("--log-file", + dest="log_file", + action="store", + type="string", + help="Location of the used log file. Default is 'cone.log'", + metavar="FILE", + default="cone.log"), + + Option("--log-config", + dest="log_conf", + action="store", + type="string", + help="Location of the used logging configuration file. Default is 'logging.ini'", + metavar="FILE"), + + Option("--username", + dest="username", + action="store", + type="string", + help="Username for webstorage operations. Not needed for filestorage or cpf storage. If the username \ + is not given, the tool will use the loggged in username.", + metavar="USERNAME"), + + Option("--password", + dest="password", + action="store", + type="string", + help="Password for webstorage operations. Not needed for filestorage or cpf storage. If the password \ + is not given, the tool will prompt for password if needed.", + metavar="PASSWORD"), +] + +def handle_common_options(options, settings=None): + """ + Handle common command line options. + @param options: The parsed command line options. + @param settings: The settings to print if --print-settings is used. + Can be None, in which case the default settings are printed. + """ + if options.log_conf: + open_log(options.verbose, options.log_file, options.log_conf) + else: + open_log(options.verbose, options.log_file) + + exit = False + + if options.print_settings: + if settings == None: + settings = get_settings([]) + print_settings(settings) + exit = True + + if options.print_supported_impls: + from cone.public import plugin + print "Supported ImplML namespaces:" + for ns in sorted(plugin.get_supported_namespaces()): + print ns + + print "" + print "Supported ImplML file extensions:" + for ns in plugin.get_supported_file_extensions(): + print ns + exit = True + + if options.print_runtime_info: + print _get_runtime_info() + print "\nsys.path contents:" + print '\n'.join(sys.path) + exit = True + + if exit: sys.exit() + +def _get_runtime_info(): + if hasattr(sys, 'executable'): executable = sys.executable + else: executable = 'N/A' + info = ["ConE version: %s" % cone_tool.VERSION, + "Python version: %s" % sys.version, + "Platform: %s" % sys.platform, + "Executable: %s" % executable, + "Command line: %s" % ' '.join(sys.argv), + "Working dir: %s" % os.getcwd(), + "Script location: %s" % ROOT_PATH] + return '\n'.join(info) + +def open_log(verbose, log_file, log_conf_file=os.path.join(ROOT_PATH, 'logging.ini')): + try: + log_dir = os.path.dirname(log_file) + if log_dir != '' and not os.path.exists(log_dir): + os.makedirs(log_dir) + + if (os.path.exists(log_conf_file)): + defaults = {'logfile': log_file, 'level': get_log_level_for_config(verbose)} + logging.config.fileConfig(log_conf_file, defaults) + else: + print "Failed to load logging configuration file: %s" % log_conf_file + + logger = logging.getLogger('cone') + logger.info("Runtime info:\n%s" % _get_runtime_info()) + logger.debug("sys.path contents:\n%s" % '\n'.join(sys.path)) + + def get_var(varname): + try: return os.environ[varname] + except KeyError: return 'N/A' + logger.debug("PATH: %s" % get_var('PATH')) + logger.debug("PYTHONPATH: %s" % get_var('PYTHONPATH')) + except IOError, e: + print "Cannot create log file. ", e + +def get_settings(files): + parser = settings.SettingsFactory.cone_parser() + parser.read(files) + return parser + +def print_settings(parser): + print_section(parser,"DEFAULT") + for section in parser.sections(): + print_section(parser,section) + +def print_section(parser, section): + print "[%s]" % section + for (name,value) in parser.items(section): + print " %s = %s" % (name,value) + + +def get_log_level(level): + """ + Change the given user input log level to logging categorisation + """ + # If the level is empty, revert to the default + if level in ('', None): + level = '3' + + if level == '0' : return logging.NOTSET + elif level == '1' : return logging.CRITICAL + elif level == '2' : return logging.ERROR + elif level == '3' : return logging.WARNING + elif level == '4' : return logging.INFO + elif level == '5' : return logging.DEBUG + else : return logging.NOTSET + +def get_log_level_for_config(level): + """ + Change the given user input to log level to logging configuration file + """ + + # If the level is empty, revert to the default + if level in ('', None): + level = 'WARNING' + + if level == '0' : return 'NOTSET' + elif level == '1' : return 'CRITICAL' + elif level == '2' : return 'ERROR' + elif level == '3' : return 'WARNING' + elif level == '4' : return 'INFO' + elif level == '5' : return 'DEBUG' + else : return 'NOTSET' + + +class ConfigurationNotFoundError(Exception): + """ + Exception raised by get_config_list_from_project() if an invalid + configuration is given. + """ + pass + +def get_config_list_from_project(project, configs, config_wildcards, config_regexes): + """ + Return a list of configuration root names based on the given parameters. + @param project: The project from which to get the configuration list. + @param configs: List of configuration names to add. All of these should exist + in the project, or a ConfigurationNotFoundError is raised. + @param config_wildcards: List of wildcard patterns for including configurations. + @param config_regexs: List of regular expression patters for including configurations. + @return: A distinct list of configuration names matched by the given parameters. The + list contains matched configurations in the following order: + 1. Configurations specified in configs + 2. Configurations matched by wildcard patterns + 3. Configurations matched by regular expressions + If a configuration is matched by more than one of these, the first match determines + its placement in the list. + @raise ConfigurationNotFoundError: A configuration specified in configs is not + actually found in the project. + """ + config_list = [] + + configs_in_project = sorted(project.list_configurations()) + + # Handle configurations specified with --configuration first + for config in configs: + if config not in configs_in_project: + raise ConfigurationNotFoundError("No such configuration: %s" % config) + if config not in config_list: + config_list.append(config) + + # Then handle wildcards + if config_wildcards: + for config in configs_in_project: + for wildcard in config_wildcards: + if fnmatch.fnmatch(config, wildcard): + if config not in config_list: + config_list.append(config) + + # Lastly handle regexes + if config_regexes: + for config in configs_in_project: + for pattern in config_regexes: + if re.match(pattern, config) is not None: + if config not in config_list: + config_list.append(config) + + return config_list