logprep 19.2.0__tar.gz → 19.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {logprep-19.2.0 → logprep-19.3.0}/PKG-INFO +4 -13
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/dummy/output.py +0 -4
- {logprep-19.2.0 → logprep-19.3.0}/logprep/filter/expression/filter_expression.py +63 -10
- {logprep-19.2.0 → logprep-19.3.0}/logprep/filter/lucene_filter.py +287 -3
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/dummy/output.py +1 -5
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/clusterer/processor.py +2 -3
- logprep-19.3.0/logprep/ng/processor/deduplicator/processor.py +50 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/clusterer/processor.py +3 -4
- logprep-19.3.0/logprep/processor/deduplicator/processor.py +50 -0
- logprep-19.3.0/logprep/processor/deduplicator/rule.py +59 -0
- logprep-19.3.0/logprep/registry.py +291 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/commands/depseudonymize.py +0 -1
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/encrypter.py +3 -3
- logprep-19.3.0/logprep/util/pseudo/keygenerator/__init__.py +0 -0
- logprep-19.3.0/logprep/util/url/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/pyproject.toml +4 -13
- logprep-19.2.0/logprep/registry.py +0 -272
- {logprep-19.2.0 → logprep-19.3.0}/LICENSE +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/README.md +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/component.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/connector.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/exceptions.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/getter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/abc/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/configuration.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/confluent_kafka/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/confluent_kafka/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/confluent_kafka/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/console/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/console/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/dummy/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/dummy/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/file/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/file/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/http/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/http/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/http/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/json/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/json/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/jsonl/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/jsonl/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/jsonl/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/opensearch/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/opensearch/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/s3/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/connector/s3/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/factory.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/factory_error.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/filter/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/filter/expression/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/pipeline.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/pipeline_manager.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/demorgan_resolver.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/node.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/rule_parser.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/rule_segmenter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/rule_sorter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/rule_tagger.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/framework/rule_tree/rule_tree.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/batcher.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/confluent_kafka/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/confluent_kafka/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/controller.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/factory.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/http/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/http/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/loader.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/manipulator.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/generator/sender.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/metrics/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/metrics/exporter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/metrics/metrics.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/abc/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/abc/event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/abc/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/abc/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/abc/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/confluent_kafka/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/confluent_kafka/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/confluent_kafka/metadata.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/confluent_kafka/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/console/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/console/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/dummy/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/dummy/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/file/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/file/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/http/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/http/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/json/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/json/input.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/jsonl/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/jsonl/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/opensearch/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/connector/opensearch/output.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/error_event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/event_state.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/filtered_event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/log_event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/pseudonym_event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/set_event_backlog.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/event/sre_event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/pipeline.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/amides/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/amides/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/calculator/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/calculator/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/clusterer/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/concatenator/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/concatenator/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/datetime_extractor/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/datetime_extractor/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/decoder/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/deleter → logprep-19.3.0/logprep/ng/processor/deduplicator}/__init__.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/dissector → logprep-19.3.0/logprep/ng/processor/deleter}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/deleter/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/domain_label_extractor → logprep-19.3.0/logprep/ng/processor/dissector}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/dissector/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/domain_resolver → logprep-19.3.0/logprep/ng/processor/domain_label_extractor}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/domain_label_extractor/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/dropper → logprep-19.3.0/logprep/ng/processor/domain_resolver}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/domain_resolver/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/field_manager → logprep-19.3.0/logprep/ng/processor/dropper}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/dropper/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/generic_adder → logprep-19.3.0/logprep/ng/processor/field_manager}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/field_manager/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/field_manager/rule.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/generic_resolver → logprep-19.3.0/logprep/ng/processor/generic_adder}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/generic_adder/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/geoip_enricher → logprep-19.3.0/logprep/ng/processor/generic_resolver}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/generic_resolver/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/grokker → logprep-19.3.0/logprep/ng/processor/geoip_enricher}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/geoip_enricher/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/ip_informer → logprep-19.3.0/logprep/ng/processor/grokker}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/grokker/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/key_checker → logprep-19.3.0/logprep/ng/processor/ip_informer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/ip_informer/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/labeler → logprep-19.3.0/logprep/ng/processor/key_checker}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/key_checker/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/list_comparison → logprep-19.3.0/logprep/ng/processor/labeler}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/labeler/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/network_comparison → logprep-19.3.0/logprep/ng/processor/list_comparison}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/list_comparison/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/pre_detector → logprep-19.3.0/logprep/ng/processor/network_comparison}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/network_comparison/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/pseudonymizer → logprep-19.3.0/logprep/ng/processor/pre_detector}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/pre_detector/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/replacer → logprep-19.3.0/logprep/ng/processor/pseudonymizer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/pseudonymizer/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/requester → logprep-19.3.0/logprep/ng/processor/replacer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/replacer/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/selective_extractor → logprep-19.3.0/logprep/ng/processor/requester}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/requester/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/string_splitter → logprep-19.3.0/logprep/ng/processor/selective_extractor}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/selective_extractor/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/template_replacer → logprep-19.3.0/logprep/ng/processor/string_splitter}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/string_splitter/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/timestamp_differ → logprep-19.3.0/logprep/ng/processor/template_replacer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/template_replacer/processor.py +0 -0
- {logprep-19.2.0/logprep/ng/processor/timestamper → logprep-19.3.0/logprep/ng/processor/timestamp_differ}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/timestamp_differ/processor.py +0 -0
- {logprep-19.2.0/logprep/processor → logprep-19.3.0/logprep/ng/processor/timestamper}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/processor/timestamper/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/runner.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/sender.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/util/configuration.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/ng/util/defaults.py +0 -0
- {logprep-19.2.0/logprep/processor/amides → logprep-19.3.0/logprep/processor}/__init__.py +0 -0
- {logprep-19.2.0/logprep/processor/base → logprep-19.3.0/logprep/processor/amides}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/amides/detection.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/amides/features.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/amides/normalize.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/amides/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/amides/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/calculator → logprep-19.3.0/logprep/processor/base}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/base/exceptions.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/base/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/clusterer → logprep-19.3.0/logprep/processor/calculator}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/calculator/fourFn.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/calculator/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/calculator/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/clusterer/signature_calculation → logprep-19.3.0/logprep/processor/clusterer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/clusterer/configuration.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/clusterer/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/clusterer/signature_calculation/rules → logprep-19.3.0/logprep/processor/clusterer/signature_calculation}/__init__.py +0 -0
- {logprep-19.2.0/logprep/processor/concatenator → logprep-19.3.0/logprep/processor/clusterer/signature_calculation/rules}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/clusterer/signature_calculation/rules/rule_template.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/clusterer/signature_calculation/signature_phase.py +0 -0
- {logprep-19.2.0/logprep/processor/datetime_extractor → logprep-19.3.0/logprep/processor/concatenator}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/concatenator/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/concatenator/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/decoder → logprep-19.3.0/logprep/processor/datetime_extractor}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/datetime_extractor/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/datetime_extractor/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/deleter → logprep-19.3.0/logprep/processor/decoder}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/decoder/decoders.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/decoder/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/decoder/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/dissector → logprep-19.3.0/logprep/processor/deduplicator}/__init__.py +0 -0
- {logprep-19.2.0/logprep/processor/domain_label_extractor → logprep-19.3.0/logprep/processor/deleter}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/deleter/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/deleter/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/domain_resolver → logprep-19.3.0/logprep/processor/dissector}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/dissector/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/dissector/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/dropper → logprep-19.3.0/logprep/processor/domain_label_extractor}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/domain_label_extractor/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/domain_label_extractor/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/field_manager → logprep-19.3.0/logprep/processor/domain_resolver}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/domain_resolver/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/domain_resolver/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/generic_adder → logprep-19.3.0/logprep/processor/dropper}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/dropper/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/dropper/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/generic_resolver → logprep-19.3.0/logprep/processor/field_manager}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/field_manager/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/field_manager/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/geoip_enricher → logprep-19.3.0/logprep/processor/generic_adder}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/generic_adder/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/generic_adder/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/grokker → logprep-19.3.0/logprep/processor/generic_resolver}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/generic_resolver/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/generic_resolver/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/ip_informer → logprep-19.3.0/logprep/processor/geoip_enricher}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/geoip_enricher/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/geoip_enricher/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/key_checker → logprep-19.3.0/logprep/processor/grokker}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/grokker/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/grokker/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/labeler → logprep-19.3.0/logprep/processor/ip_informer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/ip_informer/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/ip_informer/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/list_comparison → logprep-19.3.0/logprep/processor/key_checker}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/key_checker/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/key_checker/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/network_comparison → logprep-19.3.0/logprep/processor/labeler}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/labeler/labeling_schema.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/labeler/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/labeler/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/pre_detector → logprep-19.3.0/logprep/processor/list_comparison}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/list_comparison/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/list_comparison/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/pseudonymizer → logprep-19.3.0/logprep/processor/network_comparison}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/network_comparison/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/network_comparison/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/replacer → logprep-19.3.0/logprep/processor/pre_detector}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/pre_detector/ip_alerter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/pre_detector/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/pre_detector/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/requester → logprep-19.3.0/logprep/processor/pseudonymizer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/pseudonymizer/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/pseudonymizer/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/selective_extractor → logprep-19.3.0/logprep/processor/replacer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/replacer/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/replacer/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/string_splitter → logprep-19.3.0/logprep/processor/requester}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/requester/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/requester/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/template_replacer → logprep-19.3.0/logprep/processor/selective_extractor}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/selective_extractor/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/selective_extractor/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/timestamp_differ → logprep-19.3.0/logprep/processor/string_splitter}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/string_splitter/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/string_splitter/rule.py +0 -0
- {logprep-19.2.0/logprep/processor/timestamper → logprep-19.3.0/logprep/processor/template_replacer}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/template_replacer/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/template_replacer/rule.py +0 -0
- {logprep-19.2.0/logprep/util → logprep-19.3.0/logprep/processor/timestamp_differ}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/timestamp_differ/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/timestamp_differ/rule.py +0 -0
- {logprep-19.2.0/logprep/util/auto_rule_tester → logprep-19.3.0/logprep/processor/timestamper}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/timestamper/processor.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/processor/timestamper/rule.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/run_logprep.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/run_ng.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/runner.py +0 -0
- {logprep-19.2.0/logprep/util/grok → logprep-19.3.0/logprep/util}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/ansi.py +0 -0
- {logprep-19.2.0/logprep/util/pseudo → logprep-19.3.0/logprep/util/auto_rule_tester}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/auto_rule_tester/auto_rule_tester.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/auto_rule_tester/grok_pattern_replacer.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/cache.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/configuration.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/context_managers.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/converters.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/credentials.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/decorators.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/defaults.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/event.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/getter.py +0 -0
- {logprep-19.2.0/logprep/util/pseudo/commands → logprep-19.3.0/logprep/util/grok}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/grok.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/aws +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/bacula +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/bind +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/bro +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/exim +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/firewalls +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/grok-patterns +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/haproxy +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/httpd +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/java +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/junos +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/linux-syslog +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/maven +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/mcollective +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/mongodb +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/nagios +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/postgresql +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/rails +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/redis +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/ruby +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/squid +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/ecs-v1/zeek +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/aws +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/bacula +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/bind +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/bro +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/exim +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/firewalls +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/grok-patterns +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/haproxy +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/httpd +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/java +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/junos +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/linux-syslog +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/maven +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/mcollective +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/mcollective-patterns +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/mongodb +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/nagios +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/postgresql +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/rails +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/redis +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/ruby +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok/patterns/legacy/squid +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/grok_pattern_loader.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/hasher.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/helper.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/http.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/input_common.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/json_handling.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/logging.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pipeline_profiler.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/processor_generator.py +0 -0
- {logprep-19.2.0/logprep/util/pseudo/keygenerator → logprep-19.3.0/logprep/util/pseudo}/__init__.py +0 -0
- {logprep-19.2.0/logprep/util/url → logprep-19.3.0/logprep/util/pseudo/commands}/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/commands/generate_keys.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/commands/pseudonymize.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/decrypter.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/pseudo/keygenerator/generate_rsa_key.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/queue.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/rstr/__init__.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/rstr/rstr_base.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/rstr/xeger.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/rule_dry_runner.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/rule_loader.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/tag_yaml_loader.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/template_processor.py.j2 +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/template_processor_test.py.j2 +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/template_rule.py.j2 +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/template_rule_test.py.j2 +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/time.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/typing.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/url/tldlist/public_suffix_list.dat +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/url/url.py +0 -0
- {logprep-19.2.0 → logprep-19.3.0}/logprep/util/validators.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: logprep
|
|
3
|
-
Version: 19.
|
|
3
|
+
Version: 19.3.0
|
|
4
4
|
Summary: Logprep allows to collect, process and forward log messages from various data sources.
|
|
5
5
|
Keywords: kafka,etl,sre,preprocessing,opensearch,soar,logdata
|
|
6
6
|
License: GNU LESSER GENERAL PUBLIC LICENSE
|
|
@@ -519,49 +519,38 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
519
519
|
Classifier: Operating System :: POSIX :: Linux
|
|
520
520
|
Classifier: Topic :: Security
|
|
521
521
|
Classifier: Topic :: System :: Logging
|
|
522
|
-
Requires-Dist: aiohttp>=3.13.3,<4
|
|
523
522
|
Requires-Dist: attrs<26
|
|
524
|
-
Requires-Dist: certifi>=2023.7.22,<2026
|
|
525
523
|
Requires-Dist: confluent-kafka>2,<3
|
|
526
524
|
Requires-Dist: filelock<4
|
|
527
525
|
Requires-Dist: geoip2>=5.2.0,<6
|
|
528
526
|
Requires-Dist: jsonref<2
|
|
529
527
|
Requires-Dist: luqum<2
|
|
530
|
-
Requires-Dist: more-itertools==8.10.0
|
|
531
528
|
Requires-Dist: numpy>=1.26.0,<3
|
|
532
529
|
Requires-Dist: opensearch-py>=3.2,<4
|
|
533
530
|
Requires-Dist: prometheus-client<1
|
|
534
|
-
Requires-Dist: protobuf>=3.20.2,<7
|
|
535
531
|
Requires-Dist: pycryptodome<4
|
|
536
532
|
Requires-Dist: pyparsing<4
|
|
537
533
|
Requires-Dist: scikit-learn>=1.2.0,<2
|
|
538
|
-
Requires-Dist: scipy>=1.9.2,<2
|
|
539
534
|
Requires-Dist: joblib<2
|
|
540
|
-
Requires-Dist: pyyaml<7
|
|
541
535
|
Requires-Dist: requests>=2.33.0,<3
|
|
542
536
|
Requires-Dist: ruamel-yaml<1
|
|
543
537
|
Requires-Dist: schedule<2
|
|
544
538
|
Requires-Dist: urllib3>=2.7.0,<3
|
|
545
539
|
Requires-Dist: uvicorn<1
|
|
546
|
-
Requires-Dist: deepdiff>=8.6.2,<9
|
|
547
540
|
Requires-Dist: msgspec<1
|
|
548
541
|
Requires-Dist: boto3<2
|
|
549
|
-
Requires-Dist: pydantic<3
|
|
550
542
|
Requires-Dist: click<9
|
|
551
|
-
Requires-Dist: pandas<3
|
|
552
|
-
Requires-Dist: tabulate<1
|
|
553
543
|
Requires-Dist: falcon>=3.1.3,<5
|
|
554
544
|
Requires-Dist: uvloop<1
|
|
555
545
|
Requires-Dist: httptools<1
|
|
546
|
+
Requires-Dist: more-itertools>=11.1.0
|
|
556
547
|
Requires-Dist: black>=26.0.0 ; extra == 'dev'
|
|
557
|
-
Requires-Dist: httpx ; extra == 'dev'
|
|
558
548
|
Requires-Dist: isort ; extra == 'dev'
|
|
559
549
|
Requires-Dist: pylint ; extra == 'dev'
|
|
560
550
|
Requires-Dist: pytest ; extra == 'dev'
|
|
561
551
|
Requires-Dist: pytest-cov ; extra == 'dev'
|
|
562
552
|
Requires-Dist: responses ; extra == 'dev'
|
|
563
553
|
Requires-Dist: jinja2 ; extra == 'dev'
|
|
564
|
-
Requires-Dist: maturin ; extra == 'dev'
|
|
565
554
|
Requires-Dist: cibuildwheel ; extra == 'dev'
|
|
566
555
|
Requires-Dist: asgiref ; extra == 'dev'
|
|
567
556
|
Requires-Dist: pytest-asyncio ; extra == 'dev'
|
|
@@ -571,6 +560,7 @@ Requires-Dist: psutil ; extra == 'dev'
|
|
|
571
560
|
Requires-Dist: types-requests ; extra == 'dev'
|
|
572
561
|
Requires-Dist: types-psutil ; extra == 'dev'
|
|
573
562
|
Requires-Dist: types-pyyaml ; extra == 'dev'
|
|
563
|
+
Requires-Dist: deepdiff>=8.6.2,<9 ; extra == 'dev'
|
|
574
564
|
Requires-Dist: sphinx>=8.2.0,<9 ; extra == 'doc'
|
|
575
565
|
Requires-Dist: sphinx-rtd-theme ; extra == 'doc'
|
|
576
566
|
Requires-Dist: sphinxcontrib-datatemplates ; extra == 'doc'
|
|
@@ -579,6 +569,7 @@ Requires-Dist: sphinx-copybutton ; extra == 'doc'
|
|
|
579
569
|
Requires-Dist: nbsphinx>=0.9 ; extra == 'doc'
|
|
580
570
|
Requires-Dist: ipython>=8.7 ; extra == 'doc'
|
|
581
571
|
Requires-Dist: openpyxl ; extra == 'doc'
|
|
572
|
+
Requires-Dist: pandas<3 ; extra == 'doc'
|
|
582
573
|
Requires-Python: >=3.11
|
|
583
574
|
Project-URL: Homepage, https://github.com/fkie-cad/Logprep
|
|
584
575
|
Project-URL: Documentation, https://logprep.readthedocs.io/en/latest/
|
|
@@ -19,15 +19,11 @@ Example
|
|
|
19
19
|
|
|
20
20
|
import logging
|
|
21
21
|
import typing
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
22
|
|
|
24
23
|
from attrs import define, field, validators
|
|
25
24
|
|
|
26
25
|
from logprep.abc.output import Output
|
|
27
26
|
|
|
28
|
-
if TYPE_CHECKING:
|
|
29
|
-
from logprep.abc.connector import Connector # pragma: no cover
|
|
30
|
-
|
|
31
27
|
logger = logging.getLogger("DummyOutput")
|
|
32
28
|
|
|
33
29
|
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
import re
|
|
4
4
|
from abc import ABC, abstractmethod
|
|
5
5
|
from itertools import chain, zip_longest
|
|
6
|
-
from typing import Any, Sequence
|
|
6
|
+
from typing import Any, Generic, Sequence, TypeVar
|
|
7
7
|
|
|
8
8
|
from logprep.util.helper import field_list_to_dotted_field
|
|
9
9
|
|
|
10
|
+
RangeBoundary = TypeVar("RangeBoundary", int, float, str)
|
|
11
|
+
|
|
10
12
|
|
|
11
13
|
class FilterExpressionError(Exception):
|
|
12
14
|
"""Base class for FilterExpression related exceptions."""
|
|
@@ -289,37 +291,88 @@ class FloatFilterExpression(KeyValueBasedFilterExpression):
|
|
|
289
291
|
return value == self._expected_value
|
|
290
292
|
|
|
291
293
|
|
|
292
|
-
class RangeBasedFilterExpression(KeyBasedFilterExpression):
|
|
294
|
+
class RangeBasedFilterExpression(KeyBasedFilterExpression, Generic[RangeBoundary]):
|
|
293
295
|
"""Base class of filter expressions that match for a range of values."""
|
|
294
296
|
|
|
295
|
-
def __init__(
|
|
297
|
+
def __init__(
|
|
298
|
+
self,
|
|
299
|
+
key: Sequence[str],
|
|
300
|
+
lower_bound: RangeBoundary,
|
|
301
|
+
upper_bound: RangeBoundary,
|
|
302
|
+
include_lower_bound: bool = True,
|
|
303
|
+
include_upper_bound: bool = True,
|
|
304
|
+
):
|
|
296
305
|
super().__init__(key)
|
|
297
|
-
self._lower_bound = lower_bound
|
|
298
|
-
self._upper_bound = upper_bound
|
|
306
|
+
self._lower_bound: RangeBoundary = lower_bound
|
|
307
|
+
self._upper_bound: RangeBoundary = upper_bound
|
|
308
|
+
self._include_lower_bound = include_lower_bound
|
|
309
|
+
self._include_upper_bound = include_upper_bound
|
|
299
310
|
|
|
300
311
|
def __repr__(self) -> str:
|
|
301
|
-
|
|
312
|
+
opening_bracket = "[" if self._include_lower_bound else "{"
|
|
313
|
+
closing_bracket = "]" if self._include_upper_bound else "}"
|
|
314
|
+
|
|
315
|
+
return (
|
|
316
|
+
f"{self.key_as_dotted_string}:"
|
|
317
|
+
f"{opening_bracket}{self._lower_bound} TO {self._upper_bound}"
|
|
318
|
+
f"{closing_bracket}"
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
def _matches_lower_bound(self, value: RangeBoundary) -> bool:
|
|
322
|
+
if self._include_lower_bound:
|
|
323
|
+
return value >= self._lower_bound
|
|
324
|
+
return value > self._lower_bound
|
|
325
|
+
|
|
326
|
+
def _matches_upper_bound(self, value: RangeBoundary) -> bool:
|
|
327
|
+
if self._include_upper_bound:
|
|
328
|
+
return value <= self._upper_bound
|
|
329
|
+
return value < self._upper_bound
|
|
330
|
+
|
|
331
|
+
def _matches_range(self, value: RangeBoundary) -> bool:
|
|
332
|
+
return self._matches_lower_bound(value) and self._matches_upper_bound(value)
|
|
302
333
|
|
|
303
334
|
def does_match(self, document: dict):
|
|
304
335
|
raise NotImplementedError
|
|
305
336
|
|
|
306
337
|
|
|
307
|
-
class IntegerRangeFilterExpression(RangeBasedFilterExpression):
|
|
338
|
+
class IntegerRangeFilterExpression(RangeBasedFilterExpression[int]):
|
|
308
339
|
"""Range based filter expression that matches for integers."""
|
|
309
340
|
|
|
310
341
|
def does_match(self, document: dict) -> bool:
|
|
311
342
|
value = self._get_value(self.key, document)
|
|
312
343
|
|
|
313
|
-
|
|
344
|
+
if not isinstance(value, int) or isinstance(value, bool):
|
|
345
|
+
return False
|
|
346
|
+
|
|
347
|
+
return self._matches_range(value)
|
|
314
348
|
|
|
315
349
|
|
|
316
|
-
class FloatRangeFilterExpression(RangeBasedFilterExpression):
|
|
350
|
+
class FloatRangeFilterExpression(RangeBasedFilterExpression[float]):
|
|
317
351
|
"""Range based filter expression that matches for floats."""
|
|
318
352
|
|
|
319
353
|
def does_match(self, document: dict) -> bool:
|
|
320
354
|
value = self._get_value(self.key, document)
|
|
321
355
|
|
|
322
|
-
|
|
356
|
+
if not isinstance(value, float) or isinstance(value, bool):
|
|
357
|
+
return False
|
|
358
|
+
|
|
359
|
+
return self._matches_range(value)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class StringRangeFilterExpression(RangeBasedFilterExpression[str]):
|
|
363
|
+
"""Range based filter expression that matches for strings.
|
|
364
|
+
|
|
365
|
+
String ranges are compared lexicographically.
|
|
366
|
+
"""
|
|
367
|
+
|
|
368
|
+
def does_match(self, document: dict) -> bool:
|
|
369
|
+
value = self._get_value(self.key, document)
|
|
370
|
+
|
|
371
|
+
# Avoid comparing strings with other value types, which would raise a TypeError.
|
|
372
|
+
if not isinstance(value, str):
|
|
373
|
+
return False
|
|
374
|
+
|
|
375
|
+
return self._matches_range(value)
|
|
323
376
|
|
|
324
377
|
|
|
325
378
|
class RegExFilterExpression(KeyValueBasedFilterExpression):
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# pylint: disable=anomalous-backslash-in-string
|
|
2
|
+
# pylint: disable=too-many-positional-arguments
|
|
3
|
+
# pylint: disable=too-many-return-statements
|
|
2
4
|
r"""
|
|
3
5
|
Filter
|
|
4
6
|
======
|
|
@@ -58,6 +60,101 @@ This example is not complete, since rules are specific to processors and require
|
|
|
58
60
|
|
|
59
61
|
{ "filter": "event_id: 1 AND NOT ip_address: 192.168.0.1" }
|
|
60
62
|
|
|
63
|
+
Range-Filter
|
|
64
|
+
------------
|
|
65
|
+
|
|
66
|
+
It is possible to use range expressions to match integer, floating-point, and
|
|
67
|
+
string values. Square brackets include a boundary, while curly brackets exclude
|
|
68
|
+
a boundary. String ranges are compared lexicographically.
|
|
69
|
+
|
|
70
|
+
The lower and upper boundaries of a range must have the same type. Mixed ranges
|
|
71
|
+
such as integer-to-float, integer-to-string, or float-to-string are not
|
|
72
|
+
supported.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
.. code-block:: yaml
|
|
76
|
+
:linenos:
|
|
77
|
+
:caption: Example
|
|
78
|
+
|
|
79
|
+
filter: 'age:[18 TO 65]'
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
The example matches log messages in which the value of :code:`age` is greater
|
|
83
|
+
than or equal to :code:`18` and less than or equal to :code:`65`.
|
|
84
|
+
|
|
85
|
+
Exclusive boundaries are also supported:
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
.. code-block:: yaml
|
|
89
|
+
:linenos:
|
|
90
|
+
:caption: Example
|
|
91
|
+
|
|
92
|
+
filter: 'age:{18 TO 65}'
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
The example matches log messages in which the value of :code:`age` is greater
|
|
96
|
+
than :code:`18` and less than :code:`65`.
|
|
97
|
+
|
|
98
|
+
Floating-point ranges are supported as well:
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
.. code-block:: yaml
|
|
102
|
+
:linenos:
|
|
103
|
+
:caption: Example
|
|
104
|
+
|
|
105
|
+
filter: 'temperature:[18.5 TO 25.0]'
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
String ranges are compared lexicographically:
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
.. code-block:: yaml
|
|
112
|
+
:linenos:
|
|
113
|
+
:caption: Example
|
|
114
|
+
|
|
115
|
+
filter: 'status:[alpha TO stable]'
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
This also allows matching consistently formatted ISO-8601 timestamps as string
|
|
119
|
+
ranges:
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
.. code-block:: yaml
|
|
123
|
+
:linenos:
|
|
124
|
+
:caption: Example
|
|
125
|
+
|
|
126
|
+
filter: 'timestamp:[2024-01-01T00:00:00Z TO 2024-12-31T23:59:59Z]'
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
The example matches log messages in which the value of :code:`timestamp` is
|
|
130
|
+
lexicographically greater than or equal to :code:`2024-01-01T00:00:00Z` and
|
|
131
|
+
less than or equal to :code:`2024-12-31T23:59:59Z`.
|
|
132
|
+
|
|
133
|
+
Range boundaries containing Lucene special characters must be quoted. This is
|
|
134
|
+
required, for example, for ISO-8601 timestamps with timezone offsets:
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
.. code-block:: yaml
|
|
138
|
+
:linenos:
|
|
139
|
+
:caption: Example
|
|
140
|
+
|
|
141
|
+
filter: 'timestamp:["2024-01-01T00:00:00+01:00" TO "2024-12-31T23:59:59+01:00"]'
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
Range expressions can also be used within field groups:
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
.. code-block:: yaml
|
|
148
|
+
:linenos:
|
|
149
|
+
:caption: Example
|
|
150
|
+
|
|
151
|
+
filter: 'temperature:([18.5 TO 25.0])'
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
Open boundaries using :code:`*`, non-finite numeric boundaries, mixed boundary
|
|
155
|
+
types, and unquoted boundaries containing Lucene special characters are not
|
|
156
|
+
supported.
|
|
157
|
+
|
|
61
158
|
RegEx-Filter
|
|
62
159
|
------------
|
|
63
160
|
|
|
@@ -73,7 +170,8 @@ To be recognized as a regular expression, the filter field has to start with
|
|
|
73
170
|
filter: 'ip_address: /192\.168\.0\..*/'
|
|
74
171
|
|
|
75
172
|
|
|
76
|
-
[Deprecated, but still functional] The field with the regex pattern
|
|
173
|
+
[Deprecated, but still functional] The field with the regex pattern
|
|
174
|
+
must be added to the optional field
|
|
77
175
|
:code:`regex_fields` in the rule definition.
|
|
78
176
|
|
|
79
177
|
In the following example the field :code:`ip_address` is defined as regex field.
|
|
@@ -93,6 +191,7 @@ require additional options.
|
|
|
93
191
|
"""
|
|
94
192
|
|
|
95
193
|
import logging
|
|
194
|
+
import math
|
|
96
195
|
import re
|
|
97
196
|
from itertools import chain, zip_longest
|
|
98
197
|
from typing import Sequence
|
|
@@ -106,24 +205,31 @@ from luqum.tree import (
|
|
|
106
205
|
Not,
|
|
107
206
|
OrOperation,
|
|
108
207
|
Phrase,
|
|
208
|
+
Prohibit,
|
|
209
|
+
Range,
|
|
109
210
|
Regex,
|
|
110
211
|
SearchField,
|
|
111
212
|
Word,
|
|
112
213
|
)
|
|
214
|
+
|
|
113
215
|
from logprep.abc.exceptions import LogprepException
|
|
114
216
|
from logprep.filter.expression.filter_expression import (
|
|
115
217
|
Always,
|
|
116
218
|
And,
|
|
117
219
|
Exists,
|
|
118
220
|
FilterExpression,
|
|
221
|
+
FloatRangeFilterExpression,
|
|
222
|
+
IntegerRangeFilterExpression,
|
|
119
223
|
)
|
|
120
224
|
from logprep.filter.expression.filter_expression import Not as NotExpression
|
|
121
225
|
from logprep.filter.expression.filter_expression import (
|
|
122
226
|
Null,
|
|
123
227
|
Or,
|
|
228
|
+
RangeBoundary,
|
|
124
229
|
RegExFilterExpression,
|
|
125
230
|
SigmaFilterExpression,
|
|
126
231
|
StringFilterExpression,
|
|
232
|
+
StringRangeFilterExpression,
|
|
127
233
|
)
|
|
128
234
|
from logprep.util.helper import field_list_to_dotted_field, get_dotted_field_list
|
|
129
235
|
|
|
@@ -275,6 +381,14 @@ class LuceneTransformer:
|
|
|
275
381
|
# pylint: enable=no-value-for-parameter
|
|
276
382
|
if isinstance(tree, Group):
|
|
277
383
|
return self._parse_tree(tree.children[0])
|
|
384
|
+
|
|
385
|
+
if isinstance(tree, Range):
|
|
386
|
+
if self._last_search_field is None:
|
|
387
|
+
raise LuceneFilterError(f'The expression "{str(tree)}" is invalid!')
|
|
388
|
+
|
|
389
|
+
key = get_dotted_field_list(self._last_search_field)
|
|
390
|
+
return self._parse_range(key, tree)
|
|
391
|
+
|
|
278
392
|
if isinstance(tree, SearchField):
|
|
279
393
|
if isinstance(tree.expr, FieldGroup):
|
|
280
394
|
self._last_search_field = tree.name
|
|
@@ -288,6 +402,171 @@ class LuceneTransformer:
|
|
|
288
402
|
return self._create_value_expression(tree)
|
|
289
403
|
raise LuceneFilterError(f'The expression "{str(tree)}" is invalid!')
|
|
290
404
|
|
|
405
|
+
def _parse_range(self, key: Sequence[str], expr: Range) -> FilterExpression:
|
|
406
|
+
lower_value = self._get_range_boundary_value(expr.low)
|
|
407
|
+
upper_value = self._get_range_boundary_value(expr.high)
|
|
408
|
+
|
|
409
|
+
for range_parser in (
|
|
410
|
+
self._parse_integer_range,
|
|
411
|
+
self._parse_float_range,
|
|
412
|
+
self._parse_string_range,
|
|
413
|
+
):
|
|
414
|
+
range_filter_expression = range_parser(
|
|
415
|
+
key,
|
|
416
|
+
lower_value,
|
|
417
|
+
upper_value,
|
|
418
|
+
expr.include_low,
|
|
419
|
+
expr.include_high,
|
|
420
|
+
expr,
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
if range_filter_expression is not None:
|
|
424
|
+
return range_filter_expression
|
|
425
|
+
|
|
426
|
+
raise LuceneFilterError(f'The expression "{expr}" is invalid!')
|
|
427
|
+
|
|
428
|
+
@staticmethod
|
|
429
|
+
def _parse_integer_range(
|
|
430
|
+
key: Sequence[str],
|
|
431
|
+
lower_value: str,
|
|
432
|
+
upper_value: str,
|
|
433
|
+
include_lower_bound: bool,
|
|
434
|
+
include_upper_bound: bool,
|
|
435
|
+
expr: Range,
|
|
436
|
+
) -> IntegerRangeFilterExpression | None:
|
|
437
|
+
"""Create an integer range expression if both boundaries are integers."""
|
|
438
|
+
try:
|
|
439
|
+
lower_bound = int(lower_value)
|
|
440
|
+
upper_bound = int(upper_value)
|
|
441
|
+
except ValueError:
|
|
442
|
+
return None
|
|
443
|
+
|
|
444
|
+
LuceneTransformer._validate_range_boundaries(lower_bound, upper_bound, expr)
|
|
445
|
+
|
|
446
|
+
return IntegerRangeFilterExpression(
|
|
447
|
+
key,
|
|
448
|
+
lower_bound,
|
|
449
|
+
upper_bound,
|
|
450
|
+
include_lower_bound,
|
|
451
|
+
include_upper_bound,
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
@staticmethod
|
|
455
|
+
def _parse_float_range(
|
|
456
|
+
key: Sequence[str],
|
|
457
|
+
lower_value: str,
|
|
458
|
+
upper_value: str,
|
|
459
|
+
include_lower_bound: bool,
|
|
460
|
+
include_upper_bound: bool,
|
|
461
|
+
expr: Range,
|
|
462
|
+
) -> FloatRangeFilterExpression | None:
|
|
463
|
+
"""Create a float range expression if both boundaries are finite numbers."""
|
|
464
|
+
try:
|
|
465
|
+
lower_bound = float(lower_value)
|
|
466
|
+
upper_bound = float(upper_value)
|
|
467
|
+
except ValueError:
|
|
468
|
+
return None
|
|
469
|
+
|
|
470
|
+
if not math.isfinite(lower_bound) or not math.isfinite(upper_bound):
|
|
471
|
+
raise LuceneFilterError(
|
|
472
|
+
f'The expression "{expr}" is invalid. ' "Range boundaries must be finite numbers."
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
LuceneTransformer._validate_range_boundaries(lower_bound, upper_bound, expr)
|
|
476
|
+
|
|
477
|
+
return FloatRangeFilterExpression(
|
|
478
|
+
key,
|
|
479
|
+
lower_bound,
|
|
480
|
+
upper_bound,
|
|
481
|
+
include_lower_bound,
|
|
482
|
+
include_upper_bound,
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
@staticmethod
|
|
486
|
+
def _parse_string_range(
|
|
487
|
+
key: Sequence[str],
|
|
488
|
+
lower_value: str,
|
|
489
|
+
upper_value: str,
|
|
490
|
+
include_lower_bound: bool,
|
|
491
|
+
include_upper_bound: bool,
|
|
492
|
+
expr: Range,
|
|
493
|
+
) -> StringRangeFilterExpression | None:
|
|
494
|
+
"""Create a lexicographic string range expression for non-numeric boundaries."""
|
|
495
|
+
if lower_value == "*" or upper_value == "*":
|
|
496
|
+
raise LuceneFilterError(f'The expression "{expr}" is invalid!')
|
|
497
|
+
|
|
498
|
+
if LuceneTransformer._is_finite_numeric_range_boundary(
|
|
499
|
+
lower_value
|
|
500
|
+
) or LuceneTransformer._is_finite_numeric_range_boundary(upper_value):
|
|
501
|
+
return None
|
|
502
|
+
|
|
503
|
+
LuceneTransformer._validate_range_boundaries(lower_value, upper_value, expr)
|
|
504
|
+
|
|
505
|
+
return StringRangeFilterExpression(
|
|
506
|
+
key,
|
|
507
|
+
lower_value,
|
|
508
|
+
upper_value,
|
|
509
|
+
include_lower_bound,
|
|
510
|
+
include_upper_bound,
|
|
511
|
+
)
|
|
512
|
+
|
|
513
|
+
@staticmethod
|
|
514
|
+
def _is_finite_numeric_range_boundary(value: str) -> bool:
|
|
515
|
+
"""Return whether a range boundary can be interpreted as a finite number."""
|
|
516
|
+
try:
|
|
517
|
+
numeric_value = float(value)
|
|
518
|
+
except ValueError:
|
|
519
|
+
return False
|
|
520
|
+
|
|
521
|
+
return math.isfinite(numeric_value)
|
|
522
|
+
|
|
523
|
+
@staticmethod
|
|
524
|
+
def _get_range_boundary_value(token: luqum.tree) -> str:
|
|
525
|
+
"""Return a range boundary as a normalized string.
|
|
526
|
+
|
|
527
|
+
Luqum parses a negative boundary such as ``-10`` as
|
|
528
|
+
``Prohibit(Word("10"))`` instead of ``Word("-10")``. Quoted boundaries are
|
|
529
|
+
parsed as phrases and are required for values containing Lucene special
|
|
530
|
+
characters, such as ISO-8601 timestamps with timezone offsets.
|
|
531
|
+
"""
|
|
532
|
+
|
|
533
|
+
if isinstance(token, Word):
|
|
534
|
+
return token.value
|
|
535
|
+
|
|
536
|
+
if isinstance(token, Phrase):
|
|
537
|
+
return token.value.strip('"')
|
|
538
|
+
|
|
539
|
+
if isinstance(token, Prohibit) and len(token.children) == 1:
|
|
540
|
+
child = token.children[0]
|
|
541
|
+
|
|
542
|
+
if isinstance(child, Word):
|
|
543
|
+
return f"-{child.value}"
|
|
544
|
+
|
|
545
|
+
raise LuceneFilterError(f'The range boundary "{token}" is invalid!')
|
|
546
|
+
|
|
547
|
+
@staticmethod
|
|
548
|
+
def _validate_range_boundaries(
|
|
549
|
+
lower_bound: RangeBoundary,
|
|
550
|
+
upper_bound: RangeBoundary,
|
|
551
|
+
expr: Range,
|
|
552
|
+
) -> None:
|
|
553
|
+
"""Validate that the range boundaries form an ascending range.
|
|
554
|
+
|
|
555
|
+
Range filter expressions require the lower boundary to be less than or equal
|
|
556
|
+
to the upper boundary. This is independent of whether the boundaries are
|
|
557
|
+
inclusive or exclusive.
|
|
558
|
+
|
|
559
|
+
Numeric boundaries are compared numerically. String boundaries are compared
|
|
560
|
+
lexicographically. Without this validation, a reversed range such as
|
|
561
|
+
``[10 TO 0]`` or ``[foo TO bar]`` would be accepted but could never match
|
|
562
|
+
any value, which would hide a likely configuration error.
|
|
563
|
+
"""
|
|
564
|
+
|
|
565
|
+
if lower_bound > upper_bound:
|
|
566
|
+
raise LuceneFilterError(
|
|
567
|
+
"The lower range boundary must not exceed " f'the upper range boundary: "{expr}"'
|
|
568
|
+
)
|
|
569
|
+
|
|
291
570
|
def _create_field_group_expression(
|
|
292
571
|
self, tree: luqum.tree, dotted_field: str
|
|
293
572
|
) -> FilterExpression:
|
|
@@ -321,22 +600,27 @@ class LuceneTransformer:
|
|
|
321
600
|
return expressions
|
|
322
601
|
|
|
323
602
|
def _create_field(self, tree: luqum.tree) -> FilterExpression:
|
|
603
|
+
key = get_dotted_field_list(tree.name)
|
|
604
|
+
|
|
324
605
|
if isinstance(tree.expr, (Phrase, Word)):
|
|
325
|
-
key = get_dotted_field_list(tree.name)
|
|
326
606
|
if tree.expr.value == "null":
|
|
327
607
|
return Null(key)
|
|
328
608
|
|
|
329
609
|
value = self._strip_quote_from_string(tree.expr.value)
|
|
330
610
|
value = self._remove_lucene_escaping(value)
|
|
331
611
|
return self._get_filter_expression(key, value)
|
|
612
|
+
|
|
332
613
|
if isinstance(tree.expr, Regex):
|
|
333
|
-
key = get_dotted_field_list(tree.name)
|
|
334
614
|
if tree.expr.value == "null":
|
|
335
615
|
return Null(key)
|
|
336
616
|
|
|
337
617
|
value = self._strip_quote_from_string(tree.expr.value)
|
|
338
618
|
value = self._remove_lucene_escaping(value)
|
|
339
619
|
return self._get_filter_expression_regex(key, value)
|
|
620
|
+
|
|
621
|
+
if isinstance(tree.expr, Range):
|
|
622
|
+
return self._parse_range(key, tree.expr)
|
|
623
|
+
|
|
340
624
|
raise LuceneFilterError(f'The expression "{str(tree)}" is invalid!')
|
|
341
625
|
|
|
342
626
|
@staticmethod
|
|
@@ -19,7 +19,6 @@ Example
|
|
|
19
19
|
|
|
20
20
|
import logging
|
|
21
21
|
import typing
|
|
22
|
-
from typing import TYPE_CHECKING
|
|
23
22
|
|
|
24
23
|
from attrs import define, field, validators
|
|
25
24
|
|
|
@@ -27,9 +26,6 @@ from logprep.ng.abc.event import Event
|
|
|
27
26
|
from logprep.ng.abc.output import Output
|
|
28
27
|
from logprep.ng.event.log_event import LogEvent
|
|
29
28
|
|
|
30
|
-
if TYPE_CHECKING:
|
|
31
|
-
from logprep.abc.connector import Connector # pragma: no cover
|
|
32
|
-
|
|
33
29
|
logger = logging.getLogger("DummyOutput")
|
|
34
30
|
|
|
35
31
|
|
|
@@ -88,7 +84,7 @@ class DummyOutput(Output):
|
|
|
88
84
|
return typing.cast("DummyOutput.Config", self._config)
|
|
89
85
|
|
|
90
86
|
@Output._handle_errors
|
|
91
|
-
def store(self, event:
|
|
87
|
+
def store(self, event: LogEvent) -> None:
|
|
92
88
|
"""Store the document in the output destination.
|
|
93
89
|
|
|
94
90
|
Parameters
|
|
@@ -44,7 +44,6 @@ Processor Configuration
|
|
|
44
44
|
"""
|
|
45
45
|
|
|
46
46
|
import typing
|
|
47
|
-
from typing import Tuple
|
|
48
47
|
|
|
49
48
|
from attrs import define, field, validators
|
|
50
49
|
|
|
@@ -57,11 +56,11 @@ from logprep.processor.clusterer.signature_calculation.signature_phase import (
|
|
|
57
56
|
SignaturePhaseStreaming,
|
|
58
57
|
)
|
|
59
58
|
from logprep.util.helper import (
|
|
59
|
+
MISSING,
|
|
60
|
+
FieldValue,
|
|
60
61
|
add_fields_to,
|
|
61
62
|
get_dotted_field_value,
|
|
62
63
|
get_field_value_no_slice,
|
|
63
|
-
MISSING,
|
|
64
|
-
FieldValue,
|
|
65
64
|
)
|
|
66
65
|
|
|
67
66
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Deduplicator
|
|
3
|
+
============
|
|
4
|
+
|
|
5
|
+
The `deduplicator` is a processor that removes duplicate values from specified fields.
|
|
6
|
+
|
|
7
|
+
Processor Configuration
|
|
8
|
+
^^^^^^^^^^^^^^^^^^^^^^^
|
|
9
|
+
.. code-block:: yaml
|
|
10
|
+
:linenos:
|
|
11
|
+
|
|
12
|
+
- deduplicatorname:
|
|
13
|
+
type: deduplicator
|
|
14
|
+
rules:
|
|
15
|
+
- tests/testdata/rules/rules
|
|
16
|
+
|
|
17
|
+
.. autoclass:: logprep.processor.deduplicator.processor.Deduplicator.Config
|
|
18
|
+
:members:
|
|
19
|
+
:undoc-members:
|
|
20
|
+
:inherited-members:
|
|
21
|
+
:noindex:
|
|
22
|
+
|
|
23
|
+
.. automodule:: logprep.processor.deduplicator.rule
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import typing
|
|
27
|
+
|
|
28
|
+
from logprep.ng.abc.processor import Processor
|
|
29
|
+
from logprep.processor.base.rule import Rule
|
|
30
|
+
from logprep.processor.deduplicator.rule import DeduplicatorRule
|
|
31
|
+
from logprep.util.helper import get_dotted_field_value, add_fields_to
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Deduplicator(Processor):
|
|
35
|
+
"""A processor that removes duplicates from lists"""
|
|
36
|
+
|
|
37
|
+
rule_class = DeduplicatorRule # type: ignore
|
|
38
|
+
|
|
39
|
+
def _apply_rules(self, event: dict, rule: Rule):
|
|
40
|
+
rule = typing.cast(DeduplicatorRule, rule)
|
|
41
|
+
for field in rule.fields:
|
|
42
|
+
value_list = get_dotted_field_value(event, field)
|
|
43
|
+
if not isinstance(value_list, list):
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
unique = []
|
|
47
|
+
for value in value_list:
|
|
48
|
+
if value not in unique:
|
|
49
|
+
unique.append(value)
|
|
50
|
+
add_fields_to(event, {field: unique}, rule, False, True)
|