configurationengine/source/scripts/cone_common.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /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