Ejemplo n.º 1
0
    def _handle_func_filter(self, func_name, args, keywords):
        func_filter = _cparser_defs.trace_record_matcher_spec_s()
        func_filter.type = TRACE_MATCHER_FUNCTION
        func_filter.u.function_name = func_name.strip()
        self._struct_references.append(func_filter)

        func_trace_severity_filter = _cparser_defs.trace_record_matcher_spec_s(
        )
        func_trace_severity_filter.type = TRACE_MATCHER_SEVERITY
        func_trace_severity_filter.u.severity = TRACE_SEV_FUNC_TRACE
        self._struct_references.append(func_trace_severity_filter)

        severity_and_func = _cparser_defs.trace_record_matcher_spec_s()
        severity_and_func.type = TRACE_MATCHER_AND
        severity_and_func.u.binary_operator_parameters.a = pointer(func_filter)
        severity_and_func.u.binary_operator_parameters.b = pointer(
            func_trace_severity_filter)
        self._struct_references.append(severity_and_func)

        value_matchers = self._get_arg_matchers(args, keywords)

        if len(value_matchers):
            and_matchers = self._chain_and_matchers([severity_and_func] +
                                                    value_matchers)
            return and_matchers
        else:
            return severity_and_func
Ejemplo n.º 2
0
    def _handle_typename(self, func_name, expression):
        type_name = expression.args[0].s
        type_filter = _cparser_defs.trace_record_matcher_spec_s()
        type_filter.type = TRACE_MATCHER_TYPE
        type_filter.u.type_name = type_name
        self._struct_references.append(type_filter)

        return type_filter
Ejemplo n.º 3
0
    def _handle_typename(self, func_name, expression):
        type_name = expression.args[0].s
        type_filter = _cparser_defs.trace_record_matcher_spec_s()
        type_filter.type = TRACE_MATCHER_TYPE
        type_filter.u.type_name = type_name
        self._struct_references.append(type_filter)

        return type_filter
Ejemplo n.º 4
0
 def _handle_unary_op(self, operation):
     if not isinstance(operation.op, Not):
         raise FilterParseError()
     
     new_filter = _cparser_defs.trace_record_matcher_spec_s()
     new_filter.type = TRACE_MATCHER_NOT
     self._struct_references.append(pointer(self._parse_expression(operation.operand)))
     new_filter.u.unary_operator_parameters.param = self._struct_references[-1]
     return new_filter
Ejemplo n.º 5
0
    def _chain_and_matchers(self, matchers):
        root = _cparser_defs.trace_record_matcher_spec_s()
        current_matcher = root
        current_matcher.type = TRACE_MATCHER_AND
        for matcher in matchers:
            current_matcher.type = TRACE_MATCHER_AND
            current_matcher.u.binary_operator_parameters.a = pointer(matcher)
            self._struct_references.append(matcher)
            next_matcher = _cparser_defs.trace_record_matcher_spec_s()
            self._struct_references.append(next_matcher)
            next_matcher.type = TRACE_MATCHER_TRUE
            current_matcher.u.binary_operator_parameters.b = pointer(next_matcher)
            current_matcher = next_matcher

        true_matcher = _cparser_defs.trace_record_matcher_spec_s()
        true_matcher.type = TRACE_MATCHER_TRUE;
        current_matcher.u.binary_operator_parameters.b = pointer(true_matcher)
        self._struct_references.append(true_matcher)
        return root
Ejemplo n.º 6
0
    def _chain_and_matchers(self, matchers):
        root = _cparser_defs.trace_record_matcher_spec_s()
        current_matcher = root
        current_matcher.type = TRACE_MATCHER_AND
        for matcher in matchers:
            current_matcher.type = TRACE_MATCHER_AND
            current_matcher.u.binary_operator_parameters.a = pointer(matcher)
            self._struct_references.append(matcher)
            next_matcher = _cparser_defs.trace_record_matcher_spec_s()
            self._struct_references.append(next_matcher)
            next_matcher.type = TRACE_MATCHER_TRUE
            current_matcher.u.binary_operator_parameters.b = pointer(
                next_matcher)
            current_matcher = next_matcher

        true_matcher = _cparser_defs.trace_record_matcher_spec_s()
        true_matcher.type = TRACE_MATCHER_TRUE
        current_matcher.u.binary_operator_parameters.b = pointer(true_matcher)
        self._struct_references.append(true_matcher)
        return root
Ejemplo n.º 7
0
    def _handle_unary_op(self, operation):
        if not isinstance(operation.op, Not):
            raise FilterParseError()

        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = TRACE_MATCHER_NOT
        self._struct_references.append(
            pointer(self._parse_expression(operation.operand)))
        new_filter.u.unary_operator_parameters.param = self._struct_references[
            -1]
        return new_filter
Ejemplo n.º 8
0
    def _handle_const_str(self, expression):
        if isinstance(expression, Name):
            const_str = expression.id
        else:
            const_str = expression.s

        const_str_matcher = _cparser_defs.trace_record_matcher_spec_s()
        const_str_matcher.type = TRACE_MATCHER_CONST_SUBSTRING
        const_str_matcher.u.const_string = const_str
        self._struct_references.append(const_str_matcher)
        return const_str_matcher
Ejemplo n.º 9
0
    def _handle_const_str(self, expression):
        if isinstance(expression, Name):
            const_str = expression.id
        else:
            const_str = expression.s

        const_str_matcher = _cparser_defs.trace_record_matcher_spec_s()
        const_str_matcher.type = TRACE_MATCHER_CONST_SUBSTRING
        const_str_matcher.u.const_string = const_str
        self._struct_references.append(const_str_matcher)
        return const_str_matcher
Ejemplo n.º 10
0
    def _get_arg_matchers(self, args, keywords):
        value_matchers = []
        for arg in args:
            if not isinstance(arg, (Num, Name)):
                raise FilterParseError()

            value_matcher = _cparser_defs.trace_record_matcher_spec_s()
            value_matcher.type = TRACE_MATCHER_LOG_PARAM_VALUE

            value_matcher.u.param_value = self._resolve_value(arg)
            value_matchers.append(value_matcher)

        for keyword in keywords:
            name, value = keyword.arg, keyword.value
            field_matcher = _cparser_defs.trace_record_matcher_spec_s()
            field_matcher.type = TRACE_MATCHER_LOG_NAMED_PARAM_VALUE
            field_matcher.u.named_param_value.param_name = name
            field_matcher.u.named_param_value.param_value = self._resolve_value(
                value)
            value_matchers.append(field_matcher)

        return value_matchers
Ejemplo n.º 11
0
    def _handle_time_filter(self, expression):
        start_time = self.parser.partial_to_absolute_time(expression.left.s)
        if not start_time:
            return None

        end_time = self.parser.partial_to_absolute_time(expression.comparators[1].s)
        if not end_time:
            return None

        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = TRACE_MATCHER_TIMERANGE
        new_filter.u.time_range.start = start_time
        new_filter.u.time_range.end = end_time
        return new_filter
Ejemplo n.º 12
0
    def _handle_bool_op(self, bool_op):
        op_type_to_filter_type = {And : TRACE_MATCHER_AND,
                                  Or :  TRACE_MATCHER_OR}

        filter_type = op_type_to_filter_type[type(bool_op.op)]
        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = filter_type
        new_filter.u.binary_operator_parameters.a = pointer(self._parse_expression(bool_op.values[0]))
        new_filter.u.binary_operator_parameters.b = pointer(self._parse_expression(bool_op.values[1]))

        self._struct_references.append(new_filter.u.binary_operator_parameters.a)
        self._struct_references.append(new_filter.u.binary_operator_parameters.b)

        return new_filter
Ejemplo n.º 13
0
    def _get_arg_matchers(self, args, keywords):
        value_matchers = []
        for arg in args:
            if not isinstance(arg, (Num, Name)):
                raise FilterParseError()

            
            value_matcher = _cparser_defs.trace_record_matcher_spec_s()
            value_matcher.type = TRACE_MATCHER_LOG_PARAM_VALUE
                
            value_matcher.u.param_value = self._resolve_value(arg)
            value_matchers.append(value_matcher)

        for keyword in keywords:
            name, value = keyword.arg, keyword.value
            field_matcher = _cparser_defs.trace_record_matcher_spec_s()
            field_matcher.type = TRACE_MATCHER_LOG_NAMED_PARAM_VALUE
            field_matcher.u.named_param_value.param_name = name;
            field_matcher.u.named_param_value.param_value = self._resolve_value(value)
            value_matchers.append(field_matcher)
            
            
        return value_matchers
Ejemplo n.º 14
0
    def _handle_time_filter(self, expression):
        start_time = self.parser.partial_to_absolute_time(expression.left.s)
        if not start_time:
            return None

        end_time = self.parser.partial_to_absolute_time(
            expression.comparators[1].s)
        if not end_time:
            return None

        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = TRACE_MATCHER_TIMERANGE
        new_filter.u.time_range.start = start_time
        new_filter.u.time_range.end = end_time
        return new_filter
Ejemplo n.º 15
0
    def _handle_func_filter(self, func_name, args, keywords):
        func_filter = _cparser_defs.trace_record_matcher_spec_s()
        func_filter.type = TRACE_MATCHER_FUNCTION
        func_filter.u.function_name = func_name.strip()
        self._struct_references.append(func_filter)
        
        func_trace_severity_filter = _cparser_defs.trace_record_matcher_spec_s()
        func_trace_severity_filter.type = TRACE_MATCHER_SEVERITY
        func_trace_severity_filter.u.severity = TRACE_SEV_FUNC_TRACE
        self._struct_references.append(func_trace_severity_filter)

        severity_and_func = _cparser_defs.trace_record_matcher_spec_s()
        severity_and_func.type = TRACE_MATCHER_AND
        severity_and_func.u.binary_operator_parameters.a = pointer(func_filter)
        severity_and_func.u.binary_operator_parameters.b = pointer(func_trace_severity_filter)
        self._struct_references.append(severity_and_func)
        
        value_matchers = self._get_arg_matchers(args, keywords)
        
        if len(value_matchers):
            and_matchers = self._chain_and_matchers([severity_and_func] + value_matchers)
            return and_matchers
        else:
            return severity_and_func
Ejemplo n.º 16
0
    def _handle_comparison(self, comparison):
        if isinstance(comparison.left, Str):
            if not self._is_time_filter(comparison):
                raise FilterParseError()

            new_filter = self._handle_time_filter(comparison)
            if not new_filter:
                raise FilterParseError()
            else:
                return new_filter

        if not isinstance(comparison.ops[0], Eq):
            raise FilterParseError()

        name = self._get_expr_comparator_name(comparison)
        value = self._get_expr_comparator_value(comparison)
        field_to_filter = {
            'pid': TRACE_MATCHER_PID,
            'tid': TRACE_MATCHER_TID,
            'log_id': TRACE_MATCHER_LOGID,
            'ts': TRACE_MATCHER_TIMERANGE,
            'nesting': TRACE_MATCHER_NESTING,
            'severity': TRACE_MATCHER_SEVERITY
        }

        if not name in field_to_filter:
            raise FilterParseError()

        filter_type = field_to_filter[name]
        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = filter_type
        if filter_type == TRACE_MATCHER_PID:
            new_filter.u.pid = value
        elif filter_type == TRACE_MATCHER_NESTING:
            new_filter.u.nesting = value
        elif filter_type == TRACE_MATCHER_TID:
            new_filter.u.tid = value
        elif filter_type == TRACE_MATCHER_LOGID:
            new_filter.u.log_id = value
        elif filter_type == TRACE_MATCHER_SEVERITY:
            severity = severity_name_to_severity_value(value)
            if not severity:
                raise FilterParseError()

            new_filter.u.severity = severity

        return new_filter
Ejemplo n.º 17
0
    def _handle_bool_op(self, bool_op):
        op_type_to_filter_type = {And: TRACE_MATCHER_AND, Or: TRACE_MATCHER_OR}

        filter_type = op_type_to_filter_type[type(bool_op.op)]
        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = filter_type
        new_filter.u.binary_operator_parameters.a = pointer(
            self._parse_expression(bool_op.values[0]))
        new_filter.u.binary_operator_parameters.b = pointer(
            self._parse_expression(bool_op.values[1]))

        self._struct_references.append(
            new_filter.u.binary_operator_parameters.a)
        self._struct_references.append(
            new_filter.u.binary_operator_parameters.b)

        return new_filter
Ejemplo n.º 18
0
    def _handle_comparison(self, comparison):
        if isinstance(comparison.left, Str):
            if not self._is_time_filter(comparison):
                raise FilterParseError()

            new_filter = self._handle_time_filter(comparison)
            if not new_filter:
                raise FilterParseError()
            else:
                return new_filter
            
        if not isinstance(comparison.ops[0], Eq):
            raise FilterParseError()

        name = self._get_expr_comparator_name(comparison)
        value = self._get_expr_comparator_value(comparison)
        field_to_filter = {'pid' : TRACE_MATCHER_PID,
                           'tid' : TRACE_MATCHER_TID,
                           'log_id' : TRACE_MATCHER_LOGID,
                           'ts' : TRACE_MATCHER_TIMERANGE,
                           'nesting' : TRACE_MATCHER_NESTING,
                           'severity' : TRACE_MATCHER_SEVERITY}

        if not name in field_to_filter:
            raise FilterParseError()
        
        filter_type = field_to_filter[name]
        new_filter = _cparser_defs.trace_record_matcher_spec_s()
        new_filter.type = filter_type
        if filter_type == TRACE_MATCHER_PID:
            new_filter.u.pid = value
        elif filter_type == TRACE_MATCHER_NESTING:
            new_filter.u.nesting = value
        elif filter_type == TRACE_MATCHER_TID:
            new_filter.u.tid = value
        elif filter_type == TRACE_MATCHER_LOGID:
            new_filter.u.log_id = value
        elif filter_type == TRACE_MATCHER_SEVERITY:
            severity = severity_name_to_severity_value(value)
            if not severity:
                raise FilterParseError()
            
            new_filter.u.severity = severity

        return new_filter
Ejemplo n.º 19
0
 def true(self):
     new_filter = _cparser_defs.trace_record_matcher_spec_s()
     new_filter.type = TRACE_MATCHER_TRUE
     return TraceFilter(None, new_filter)
Ejemplo n.º 20
0
 def _handle_procname_filter(self, process_name):
     process_filter = _cparser_defs.trace_record_matcher_spec_s()
     process_filter.type = TRACE_MATCHER_PROCESS_NAME
     process_filter.u.process_name = process_name
     self._struct_references.append(process_filter)
     return process_filter
Ejemplo n.º 21
0
 def _handle_procname_filter(self, process_name):
     process_filter = _cparser_defs.trace_record_matcher_spec_s()
     process_filter.type = TRACE_MATCHER_PROCESS_NAME
     process_filter.u.process_name = process_name
     self._struct_references.append(process_filter)
     return process_filter
Ejemplo n.º 22
0
 def true(self):
     new_filter = _cparser_defs.trace_record_matcher_spec_s()
     new_filter.type = TRACE_MATCHER_TRUE;
     return TraceFilter(None, new_filter)