예제 #1
0
    def CheckFile(self, path):
        """Validates the definition in a file.

    Args:
      path (str): path of the definition file.

    Returns:
      bool: True if the file contains valid definitions.
    """
        print('Checking: {0:s}'.format(path))

        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()
        result = False

        try:
            definitions_reader.ReadFile(definitions_registry, path)
            result = True

        except KeyError as exception:
            logging.warning(
                ('Unable to register data type definition in file: {0:s} with '
                 'error: {1:s}').format(path, exception))

        except errors.FormatError as exception:
            logging.warning(
                'Unable to validate file: {0:s} with error: {1:s}'.format(
                    path, exception))

        return result
예제 #2
0
    def testReadFileObjectStructureWithSequenceWithExpression(self):
        """Tests the ReadFileObject function of a structure with a sequence."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'structure.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 5)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'sphere3d')
        self.assertIsInstance(data_type_definition,
                              data_types.StructureDefinition)
        self.assertEqual(data_type_definition.name, u'sphere3d')
        self.assertEqual(data_type_definition.description,
                         u'Sphere in 3 dimensional space.')

        self.assertEqual(len(data_type_definition.members), 2)

        member_definition = data_type_definition.members[1]
        self.assertIsInstance(member_definition, data_types.SequenceDefinition)
        self.assertEqual(member_definition.name, u'triangles')
        self.assertEqual(member_definition.element_data_type, u'triangle3d')
        self.assertIsNotNone(member_definition.element_data_type_definition)

        byte_size = data_type_definition.GetByteSize()
        self.assertIsNone(byte_size)
예제 #3
0
    def testReadFileObjectSequence(self):
        """Tests the ReadFileObject function of a sequence data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'sequence.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 2)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'vector4')
        self.assertIsInstance(data_type_definition,
                              data_types.SequenceDefinition)
        self.assertEqual(data_type_definition.name, u'vector4')
        self.assertEqual(data_type_definition.description,
                         u'vector with 4 elements')
        self.assertEqual(data_type_definition.aliases, [u'VECTOR'])
        self.assertEqual(data_type_definition.element_data_type, u'int32')
        self.assertIsNotNone(data_type_definition.element_data_type_definition)
        self.assertEqual(data_type_definition.number_of_elements, 4)

        byte_size = data_type_definition.GetByteSize()
        self.assertEqual(byte_size, 16)
예제 #4
0
    def testReadFileObjectStructure(self):
        """Tests the ReadFileObject function of a structure data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'structure.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 5)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'point3d')
        self.assertIsInstance(data_type_definition,
                              data_types.StructureDefinition)
        self.assertEqual(data_type_definition.name, u'point3d')
        self.assertEqual(data_type_definition.description,
                         u'Point in 3 dimensional space.')
        self.assertEqual(data_type_definition.aliases, [u'POINT'])

        self.assertEqual(len(data_type_definition.members), 3)

        member_definition = data_type_definition.members[0]
        self.assertIsInstance(member_definition,
                              data_types.StructureMemberDefinition)
        self.assertEqual(member_definition.name, u'x')
        self.assertEqual(member_definition.aliases, [u'XCOORD'])
        self.assertEqual(member_definition.member_data_type, u'int32')
        self.assertIsNotNone(member_definition.member_data_type_definition)

        byte_size = data_type_definition.GetByteSize()
        self.assertEqual(byte_size, 12)
예제 #5
0
    def testReadFileObjectInteger(self):
        """Tests the ReadFileObject function of an integer data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'integer.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 1)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'int32le')
        self.assertIsInstance(data_type_definition,
                              data_types.IntegerDefinition)
        self.assertEqual(data_type_definition.name, u'int32le')
        self.assertEqual(data_type_definition.byte_order,
                         definitions.BYTE_ORDER_LITTLE_ENDIAN)
        self.assertEqual(data_type_definition.format, u'signed')
        self.assertEqual(data_type_definition.size, 4)
        self.assertEqual(data_type_definition.units, u'bytes')

        byte_size = data_type_definition.GetByteSize()
        self.assertEqual(byte_size, 4)
예제 #6
0
    def testReadFileObjectMissingType(self):
        """Tests the ReadFileObject function with a missing type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        yaml_data = u'\n'.join([
            u'name: int8', u'attributes:', u'  format: signed', u'  size: 1',
            u'  units: bytes'
        ]).encode(u'ascii')

        file_object = io.BytesIO(initial_bytes=yaml_data)

        with self.assertRaises(errors.FormatError):
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        yaml_data = u'\n'.join([
            u'name: int8', u'type: integer', u'attributes:',
            u'  format: signed', u'  size: 1', u'  units: bytes', u'---',
            u'name: int16', u'attributes:', u'  format: signed', u'  size: 2',
            u'  units: bytes'
        ]).encode(u'ascii')

        file_object = io.BytesIO(initial_bytes=yaml_data)

        with self.assertRaises(errors.FormatError):
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)
예제 #7
0
    def ReadDefinitions(self, path):
        """Reads the definitions form file or directory.

    Args:
      path (str): path of the definition file.
    """
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()
        definitions_reader.ReadFile(self._definitions_registry, path)
예제 #8
0
    def testReadDirectory(self):
        """Tests the ReadDirectory function."""
        definitions_directory = self._GetTestFilePath([u'definitions'])

        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_reader.ReadDirectory(definitions_registry,
                                         definitions_directory)
예제 #9
0
  def _GetDataFormatInformationFromPackage(self, package):
    """Retrieves event data attribute containers from a package.

    Args:
      package (list[str]): package name segments such as ["plaso", "parsers"].

    Returns:
      list[DataFormatDescriptor]: data format descriptors.
    """
    data_format_descriptors = []
    package_path = '/'.join(package)
    for _, name, is_package in pkgutil.iter_modules(path=[package_path]):
      sub_package = list(package)
      sub_package.append(name)
      if is_package:
        sub_data_format_descriptors = (
            self._GetDataFormatInformationFromPackage(sub_package))
        data_format_descriptors.extend(sub_data_format_descriptors)
      else:
        module_path = '.'.join(sub_package)
        module_object = importlib.import_module(module_path)

        for _, cls in inspect.getmembers(module_object, inspect.isclass):
          if issubclass(cls, (
              parsers_interface.BaseParser, parsers_plugins.BasePlugin)):

            # TODO: detect corresponding dtFabric .yaml file
            parser_name = getattr(cls, 'NAME', None)
            if not parser_name or parser_name in self._PARSER_NAME_IGNORE_LIST:
              continue

            category = self._DATA_FORMAT_CATEGORY_PER_PACKAGE_PATH.get(
                package_path, 'File formats')

            data_format = getattr(cls, 'DATA_FORMAT', None)
            url = ''

            dtfabric_file = os.path.join(package_path, ''.join([name, '.yaml']))
            if os.path.exists(dtfabric_file):
              definitions_registry = (
                  dtfabric_registry.DataTypeDefinitionsRegistry())
              definitions_reader = (
                  dtfabric_reader.YAMLDataTypeDefinitionsFileReader())

              try:
                definitions_reader.ReadFile(definitions_registry, dtfabric_file)
                # TODO: determine the URL using definitions_registry.
              except Exception:  # pylint: disable=broad-except
                pass

            data_format_descriptor = DataFormatDescriptor(
                category=category, name=data_format, url=url)
            data_format_descriptors.append(data_format_descriptor)

    return data_format_descriptors
예제 #10
0
    def _FillDefinitionRegistryFromFile(self, definitions_registry, path):
        """Fills a data type definition registry from a file.

    Args:
      definitions_registry (DataTypeDefinitionsRegistry): data type definitions
          registry.
      path (str): path to the data definition file.

    """
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        with io.open(path, 'r', encoding='utf8') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)
예제 #11
0
    def ReadDefinitions(self, path):
        """Reads the definitions form file or directory.

    Args:
      path (str): path of the definition file or directory.
    """
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        if os.path.isdir(path):
            definitions_reader.ReadDirectory(
                self._structure_definitions_registry, path)
        else:
            definitions_reader.ReadFile(self._structure_definitions_registry,
                                        path)
예제 #12
0
    def __init__(self, yaml_definition=None):
        """Initializes a data type fabric.

    Args:
      yaml_definition (str): YAML formatted data type definitions.
    """
        definitions_registry = registry.DataTypeDefinitionsRegistry()

        if yaml_definition:
            definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

            file_object = io.BytesIO(yaml_definition)
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        super(DataTypeFabric, self).__init__(definitions_registry)
예제 #13
0
    def testReadFileObjectConstant(self):
        """Tests the ReadFileObject function of a constant data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'constant.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 1)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'maximum_number_of_back_traces')
        self.assertIsInstance(data_type_definition,
                              data_types.ConstantDefinition)
        self.assertEqual(data_type_definition.name,
                         u'maximum_number_of_back_traces')
        self.assertEqual(data_type_definition.value, 32)
예제 #14
0
    def testReadFileObjectCharacter(self):
        """Tests the ReadFileObject function of a character data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'character.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 1)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'char')
        self.assertIsInstance(data_type_definition,
                              data_types.CharacterDefinition)
        self.assertEqual(data_type_definition.name, u'char')
        self.assertEqual(data_type_definition.size, 1)
        self.assertEqual(data_type_definition.units, u'bytes')

        byte_size = data_type_definition.GetByteSize()
        self.assertEqual(byte_size, 1)
예제 #15
0
    def testReadFileObjectEnumeration(self):
        """Tests the ReadFileObject function of an enumeration data type."""
        definitions_registry = registry.DataTypeDefinitionsRegistry()
        definitions_reader = reader.YAMLDataTypeDefinitionsFileReader()

        definitions_file = self._GetTestFilePath([u'enumeration.yaml'])
        with open(definitions_file, 'rb') as file_object:
            definitions_reader.ReadFileObject(definitions_registry,
                                              file_object)

        self.assertEqual(len(definitions_registry._definitions), 1)

        data_type_definition = definitions_registry.GetDefinitionByName(
            u'object_information_type')
        self.assertIsInstance(data_type_definition,
                              data_types.EnumerationDefinition)
        self.assertEqual(data_type_definition.name, u'object_information_type')
        self.assertEqual(data_type_definition.size, 4)
        self.assertEqual(data_type_definition.units, u'bytes')
        self.assertEqual(len(data_type_definition.values), 6)

        byte_size = data_type_definition.GetByteSize()
        self.assertEqual(byte_size, 4)