Source code for stix2generator

import json
import os.path

import faker

import stix2generator.language.builder
import stix2generator.generation.object_generator
import stix2generator.generation.reference_graph_generator
import stix2generator.generation.semantics
import stix2generator.generation.stix_generator
from stix2generator.exceptions import RegistryNotFoundError

try:
    from collections.abc import Mapping
except ImportError:
    from collections import Mapping

_STIX_REGISTRIES = {
    "2.1": "stix21_registry.json"
}


def _get_registry(stix_version):
    """
    Get the object generator registry for the given STIX version.

    :param stix_version: a STIX version
    :return: An object generator registry, as parsed JSON
    :raises stix2generator.exceptions.RegistryNotFoundError: If there isn't a
        built-in registry for the given STIX version
    :raises IOError: (python 2) If the registry JSON file couldn't be opened
        or read
    :raises OSError: (python 3) If the registry JSON file couldn't be opened
        or read (IOError is retained as an alias for backward compatibility).
    """
    if stix_version not in _STIX_REGISTRIES:
        raise RegistryNotFoundError(stix_version)

    spec_registry_path = os.path.join(
        os.path.dirname(__file__),
        _STIX_REGISTRIES[stix_version]
    )

    with open(spec_registry_path, encoding="utf-8") as f:
        spec_registry = json.load(f)

    return spec_registry


[docs]def create_object_generator( object_generator_config=None, extra_specs=None, stix_version="2.1" ): """ Create an instance of the built-in object generator. :param object_generator_config: A Config object with generator settings, or None to use defaults. :param extra_specs: Any extra specifications which should be added to the built-in specs this generator will use, or None if there aren't any. The extra specs are overlaid on the built-in specs, so built-in specs can be overridden this way. (dict) :param stix_version: The STIX version to use, as a string ("2.0", "2.1", etc). :return: The object generator :raises stix2generator.exceptions.RegistryNotFoundError: If there isn't a built-in registry for the given STIX version :raises IOError: (python 2) If the registry JSON file couldn't be opened or read :raises OSError: (python 3) If the registry JSON file couldn't be opened or read (IOError is retained as an alias for backward compatibility). """ spec_registry = _get_registry(stix_version) if extra_specs: _update_dict_recursive(spec_registry, extra_specs) stix_semantics = stix2generator.generation.semantics.STIXSemantics() faker_ = faker.Faker() faker_semantics = stix2generator.generation.semantics.FakerSemantics(faker_) semantics_providers = [ stix_semantics, faker_semantics ] generator = stix2generator.generation.object_generator.ObjectGenerator( spec_registry, semantics_providers, object_generator_config ) return generator
[docs]def create_stix_generator( object_generator_config=None, ref_graph_generator_config=None, stix_generator_config=None, extra_specs=None, stix_version="2.1" ): object_generator = create_object_generator( object_generator_config, extra_specs, stix_version ) ref_graph_generator = stix2generator.generation.reference_graph_generator \ .ReferenceGraphGenerator( object_generator, ref_graph_generator_config, stix_version ) stix_generator = stix2generator.generation.stix_generator.STIXGenerator( object_generator, ref_graph_generator, stix_generator_config, stix_version ) return stix_generator
def _update_dict_recursive(base_dict, new_dict): """ Recursively updates a dictionary. :param base_dict: The original dictionary that will be updated in place. :param new_dict: The dictionary of values to update the original one with. :return: The updated dictionary """ for key, val in new_dict.items(): if isinstance(val, Mapping): base_dict[key] = _update_dict_recursive(base_dict.get(key, {}), val) else: base_dict[key] = val return base_dict
[docs]def create_default_language_processor( object_generator_config=None, extra_specs=None, stix_version="2.1" ): """ Creates a language processor instance which uses the built-in object generator with the given settings. :param object_generator_config: Configuration information for the object generator, which will be used to generate any objects required by prototyping language this processor processes. :param extra_specs: Any extra specifications which should be added to the built-in specs this generator will use, or None if there aren't any. The extra specs are overlaid on the built-in specs, so built-in specs can be overridden this way. (dict) :param stix_version: Which version of STIX to use. :return: A language processor instance """ object_generator = create_object_generator( object_generator_config, extra_specs, stix_version ) processor = stix2generator.language.builder.LanguageProcessor( object_generator, stix_version ) return processor