configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
## 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
# @author <author>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
ConE plugin to run external applications/tools with given parameters in .commandml file. Notice that values can be also
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
fecthed from ConfML to maximize portability and minimize maintenance.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
import types
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
import subprocess
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
import __init__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
from cone.public import exceptions,plugin,utils,api, settings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
class CommandImpl(plugin.ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    Plugin implementation class. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    IMPL_TYPE_ID = "commandml"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    def __init__(self,ref,configuration, reader):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        Overloading the default constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        plugin.ImplBase.__init__(self,ref,configuration)###3
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        self.desc = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        self.logger = logging.getLogger('cone.commandml(%s)' % self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        self.reader = reader
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        Generate the given implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        self.create_output()        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    def generate_layers(self,layers):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        Generate the given Configuration layers.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        self.logger.info('Generating layers %s' % layers)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
        self.create_output(layers)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    def create_output(self, layers=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
        Function to generate output files.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
        tmpDict = self.__create_helper_variables()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        for element in self.reader.elements:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
            #Element can be either command or condition.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
            element.set_logger(self.logger)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
            element.execute(tmpDict)        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
        return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    def __create_helper_variables(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
        Internal function to create dictionary containing most often used ConE "environment" variables.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
        tmp = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        tmp["%CONE_OUT%"] = self.output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(self.output)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        return tmp    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    def has_ref(self, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        @returns True if the implementation uses the given ref as input value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        Otherwise return False.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        # return true for now so that content copying is not filtered 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
class CommandImplReader(plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    Parses a single commandml file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    NAMESPACE = 'http://www.s60.com/xml/commandml/1'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
    FILE_EXTENSIONS = ['commandml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        Constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
        self.output_dir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
        self.input_dir = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        self.namespaces = [self.NAMESPACE]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        self.dview = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        self.elements = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        self.tags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        reader = CommandImplReader()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        reader.set_default_view(configuration.get_default_view())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        reader.from_etree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        impl = CommandImpl(resource_ref, configuration, reader)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        if reader.tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
            impl.set_tags(reader.tags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        return impl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
    def set_default_view(self, dview):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        Function to set default view that is needed when solving out ConfML reference information
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        self.dview = dview
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
    def from_etree(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        Parser function for commandml element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        self.parse_tree(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    def parse_tree(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        General parse function for condition and command elements.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        elements = list(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        for element in elements:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
            if element.tag == "{%s}condition" % self.namespaces[0]:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
                self.elements.append(self.parse_condition(element))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            elif element.tag == "{%s}command" % self.namespaces[0]:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                self.elements.append(self.parse_command(element))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
                pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        self.tags = self.parse_tags(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
    def parse_condition(self, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
        Parse function for condition element.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        condition = Condition()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
        condition.set_condition(etree.get("value"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
        condition.set_commands(self.parse_commands(etree))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
        condition.set_default_view(self.dview)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        return condition                                   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
    def parse_commands(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        Parser function for commands.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        commands = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
        for com_elem in etree.findall("{%s}command" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
            commands.append(self.parse_command(com_elem))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
        return commands
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
    def parse_command(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        Parser function for single command.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        cmd = Command()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        cmd.set_executable(etree.get("executable"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        cmd.set_shell(etree.get("shell"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        cmd.set_bufsize(etree.get("bufsize"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
        cmd.set_cwd(etree.get("cwd")) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        cmd.set_all_envs(etree.get("env"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
        cmd.set_all_arguments(self.parse_arguments(etree))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        cmd.set_all_pipes(self.parse_pipes(etree))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        cmd.set_filters(self.parse_filters(etree))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        cmd.set_default_view(self.dview)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        return cmd
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
    def parse_arguments(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        Parser function for command's arguments.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        arguments = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        for argument in etree.findall("{%s}argument" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
            value = argument.get("value")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
            if value:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
                arguments.append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        return arguments
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
    def parse_pipes(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        Parser function for command's pipes.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        pipes = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
        for argument in etree.findall("{%s}pipe" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
            name = argument.get("name")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
            value = argument.get("value")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
            if name:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
                pipes[name] = value        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        return pipes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
    def parse_filters(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        Parser function for command's filters.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        filters = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
        for argument in etree.findall("{%s}filter" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
            f = Filter()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
            f.set_severity(argument.get("severity"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
            f.set_condition(argument.get("condition"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
            f.set_input(argument.get("input"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            f.set_formatter(argument.get("formatter"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            filters.append(f)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        return filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    def parse_tags(self,etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        tags = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        for tag in etree.getiterator("{%s}tag" % self.namespaces[0]):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
            tagname = tag.get('name','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
            tagvalue = tag.get('value')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
            values = tags.get(tagname,[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            values.append(tagvalue)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
            tags[tagname] = values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        return tags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
class Condition(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
    Condition class is a simple wrapper class for commands so that commands are executed
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
    only if condition is True. Otherwise class does nothing. Class has similar interface 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
    than Command class so that they can be used similar way from plugin perspective. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        self.condition = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        self.commands = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        self.logger = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        self.dview = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
    def set_condition(self, condition):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
        self.condition = condition
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
    def set_default_view(self, dview):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        self.dview = dview
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
    def set_commands(self, commands):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
        self.commands = commands
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
    def set_logger(self, logger):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        self.logger = logger
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        for cmd in self.commands:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
            cmd.set_logger(logger)        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
    def add_command(self, command):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        self.command.append(command)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
    def execute(self, replaceDict=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        if self.__solve_condition(self.condition):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
            #Condition is true -> running command
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
            for command in self.commands:                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
                command.execute(replaceDict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
            self.logger.info("Ignoring %s because it is evaluated as False." % self.condition)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    def __solve_condition(self, condition_str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
        Internal function to handle condition
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        if condition_str != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
            #Expanding ConfML information
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
            modstr = utils.expand_delimited_tokens(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
                condition_str,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
                lambda ref, index: repr(self.dview.get_feature(ref).get_value()))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
            return eval(modstr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
            #Empty condition is true always.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
            return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
class Command(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
    Command is a class that executes actual commands. It provides ways to handle input, output and error 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
    streams and to control execution parameters.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        Constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        self.executable = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
        self.shell = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        self.bufsize = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        self.cwd = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        self.envs = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        self.arguments = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        self.pipes = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        self.streams = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        self.filters = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        self.logger = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        self.dview = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
    def set_executable(self, executable):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        self.executable = executable
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
    def set_shell(self, shell):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        if shell and shell.lower() in ('true', 'yes', '1', 1, True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            self.shell = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            self.shell = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
    def set_bufsize(self, bufsize):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        if bufsize:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
            self.bufsize = int(bufsize)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
    def set_cwd(self, cwd):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        self.cwd = cwd
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
    def set_all_envs(self, envs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        if envs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
            self.envs = eval(envs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
    def set_default_view(self, dview):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        self.dview = dview
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
    def set_env(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
        self.envs[name] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
    def set_all_arguments(self, args):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        self.arguments = args
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
    def get_arguments_string(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        Function to return arguments as a string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
        arg_string = ""        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
        for value in self.arguments:            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
            arg_string += value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
            arg_string += " "                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        return arg_string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
    def get_pipe(self, name, mode='w'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        Function to return pipe based on the pipe name in requested mode.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
        if self.pipes.has_key(name) and isinstance(self.pipes[name], types.IntType):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
        #Subprocess pipe
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
            return self.pipes[name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        elif self.pipes.has_key(name) and isinstance(self.pipes[name], types.StringType):            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
            return file(self.pipes[name], mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
    def set_streams(self, stdin, stdout, stderr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        self.streams["stdin"] = stdin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
        self.streams["stdout"] = stdout
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        self.streams["stderr"] = stderr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
                        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
    def get_streams(self, name, mode="r"):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
        if self.streams.has_key(name) and self.streams[name]:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
        #OK for streams set with subprocess.PIPE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
            return self.streams[name]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        #For file objects
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
            return self.get_pipe(name, mode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
    def set_filters(self, filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        self.filters = filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
        for f in self.filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
            f.set_command(self)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
    def get_filters(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
        return self.filters
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
    def set_argument(self, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        self.arguments.append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
    def set_all_pipes(self, pipes):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        for pipe in pipes.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
            self.set_pipe(pipe, pipes[pipe])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
    def set_pipe(self, name, value):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
        if value == "PIPE":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
            #Creating new stream for this.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
            self.pipes[name] = subprocess.PIPE
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
        elif value == "STDOUT":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
            self.pipes[name] = subprocess.STDOUT
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
            #Setting filename
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
            self.pipes[name] = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
            #self.pipes[name] = file(value, 'w')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
    def handle_filters(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        for filter in self.filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
            filter.report(self.logger)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
    def execute(self, replaceDict=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
        self.solve_refs()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
        exit_code = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
            try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
                if self.cwd is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
                    cwd = self.__replace_helper_variables(self.cwd, replaceDict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
                    cwd = self.cwd
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
                command_str = self.executable + " " + self.__replace_helper_variables(self.get_arguments_string(), replaceDict)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
                self.logger.info("Running command: \"%s\"" % command_str)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
                self.logger.info("with args: shell=%s envs=%s cwd=%s bufsize=%s stdin=%s stdout=%s stderr=%s" \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
                                 % (self.shell, self.envs, cwd, self.bufsize, \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
                                    self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))                    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
                pid = subprocess.Popen(command_str, shell=self.shell, env=self.envs, cwd=cwd,\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
                                          bufsize=self.bufsize, stdin = self.get_pipe("stdin", 'r'),\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
                                          stdout = self.get_pipe("stdout"), stderr = self.get_pipe("stderr"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
                #Waiting for process to complete
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
                retcode = pid.wait()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
                #Storing stream information for possible further processing.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
                self.set_streams(pid.stdin, pid.stdout, pid.stderr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
                if retcode < 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
                    self.logger.error("Child was terminated by signal %s" % (-retcode))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
                    self.logger.info("Child returned: %s" % retcode)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            except OSError, e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
                self.logger.error("Execution failed: %s", repr(e))            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
            self.handle_filters()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
        except Exception,e:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
            utils.log_exception(self.logger, "Failed to execute command: %s" % e)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
    def set_logger(self, logger):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
        self.logger = logger        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    def __replace_helper_variables(self, inputstr, dictionary):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
        retstr = inputstr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
        for key in dictionary.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
            retstr = retstr.replace(key, dictionary[key])            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
        return retstr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
    def solve_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
        Function to solve references just before generation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
        self.executable = self.__solve_ref(self.executable)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
        self.shell = self.__solve_ref(self.shell)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
        self.bufsize = self.__solve_ref(self.bufsize)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
        self.cwd = self.__solve_ref(self.cwd)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
        for argument in self.arguments:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
            self.arguments[self.arguments.index(argument)] = self.__solve_ref(argument) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
        for pipe in self.pipes.keys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
            self.pipes[pipe] = self.__solve_ref(self.pipes[pipe])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
    def __solve_ref(self, inputstr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
        Internal function to solve whether input is ref or just normal input string. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
        For refs actual ConfML value is resolved and returned. Non-refs are returned 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
        as such.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
        """        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        if inputstr and isinstance(inputstr, types.StringType):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
            return utils.expand_refs_by_default_view(inputstr, self.dview)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
            return inputstr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
class Filter(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
    Filter class handles printing information to ConE log using filtering information.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
    Filtering severity, condition and the format of output can be configured in command ml. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
    def __init__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        self.severity = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
        self.condition = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
        self.input = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
        self.command = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   484
        self.formatter = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   485
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
    def set_severity(self, severity):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
        self.severity = severity
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   489
    def set_condition(self, condition):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   490
        self.condition = condition
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   491
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   492
    def set_input(self, input):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
        self.input = input
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
    def set_command(self, command):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   496
        self.command = command
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   497
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   498
    def set_formatter(self, formatter):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   499
        self.formatter = formatter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   500
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   501
    def report(self, logger):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   502
        input_pipe = self.command.get_streams(self.input)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
        if isinstance(input_pipe, types.FileType):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
            #Subprocess.PIPE and file descriptors supported only.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
            data = input_pipe.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
            pattern = re.compile(self.condition)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
            for line in data.splitlines():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
                mo = pattern.match(line)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
                if mo:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
                    lf = self.__get_logger_function(logger)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
                    if self.formatter:                        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
                        lf(self.formatter % mo.groupdict())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
                    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
                        lf(line)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
    def __get_logger_function(self, logger):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
        if self.severity == "info":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
            return logger.info
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
        elif self.severity == "warning":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
            return logger.warning
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
        elif self.severity == "debug":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
            return logger.debug
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
        elif self.severity == "exception":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
            return logger.exception
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
        elif self.severity == "error":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
            return logger.error
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
        elif self.severity == "critical":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
            return logger.critical
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
            #Default
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
            return logger.info
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539