howler-api 3.1.0.dev388__tar.gz → 3.1.0.dev391__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.
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/PKG-INFO +1 -1
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/collection.py +2 -2
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/store.py +26 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/analytic.py +6 -1
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/pyproject.toml +1 -1
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/README.md +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/add_label.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/change_field.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/demote.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/example_plugin.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/prioritization.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/promote.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/remove_label.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/actions/transition.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/base.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/socket.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/action.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/analytic.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/auth.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/clue.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/configs.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/dossier.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/help.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/hit.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/notebook.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/overview.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/search.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/template.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/tool.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/user.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/api/v1/view.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/app.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/README.md +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/classification.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/classification.yml +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/exceptions.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/loader.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/logging/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/logging/audit.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/logging/format.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/net.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/net_static.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/random_user.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/common/swagger.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/config.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/cronjobs/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/cronjobs/retention.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/cronjobs/rules.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/README.md +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/bulk.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/constants.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/exceptions.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/howler_store.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/operations.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/schemas.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/support/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/support/build.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/support/schemas.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/types.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/error.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/generate_mitre.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/generate_tlds.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/reindex_data.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/external/wipe_databases.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/gunicorn_config.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/healthz.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/azure.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/discover.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/hit.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/oauth.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/search.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/workflow.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/helper/ws.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/README.md +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/base.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/charter.txt +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/helper.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/howler_enum.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/action.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/aws.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/azure.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/cbs.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/config.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/dossier.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/gcp.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/hit.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/howler_data.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/lead.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/localized_label.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/overview.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/pivot.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/template.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/user.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/view.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/random_data.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/randomizer.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/patched.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/plugins/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/plugins/config.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/README.md +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/events.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/hash.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/lock.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/priority.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/set.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/user_quota_tracker.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/security/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/security/socket.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/security/utils.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/action_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/analytic_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/auth_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/config_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/dossier_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/event_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/hit_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/jwt_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/lucene_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/notebook_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/overview_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/template_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/services/user_service.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/__init__.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/annotations.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/chunk.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/dict_utils.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/isotime.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/list_utils.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/lucene.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/path.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/socket_utils.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/str_utils.py +0 -0
- {howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/utils/uid.py +0 -0
|
@@ -377,10 +377,10 @@ class ESCollection(Generic[ModelType]):
|
|
|
377
377
|
elasticsearch.exceptions.AuthenticationException,
|
|
378
378
|
) as e:
|
|
379
379
|
if not isinstance(e, SearchRetryException):
|
|
380
|
-
logger.
|
|
380
|
+
logger.exception(
|
|
381
381
|
f"No connection to Elasticsearch server(s): "
|
|
382
382
|
f"{' | '.join(self.datastore.get_hosts(safe=True))}"
|
|
383
|
-
f", because [{e}] retrying {func.__name__}..."
|
|
383
|
+
f", because [{str(e)}] retrying {func.__name__}..." # noqa: TRY401
|
|
384
384
|
)
|
|
385
385
|
|
|
386
386
|
time.sleep(min(retries, self.MAX_RETRY_BACKOFF))
|
|
@@ -4,18 +4,28 @@ import logging
|
|
|
4
4
|
import os
|
|
5
5
|
import re
|
|
6
6
|
from os import environ
|
|
7
|
+
from pathlib import Path
|
|
7
8
|
from typing import Any, Optional, cast
|
|
8
9
|
from urllib.parse import urlparse
|
|
9
10
|
|
|
10
11
|
import elasticsearch
|
|
11
12
|
import elasticsearch.client
|
|
12
13
|
|
|
14
|
+
from howler.common.logging.format import HWL_DATE_FORMAT, HWL_LOG_FORMAT
|
|
13
15
|
from howler.datastore.collection import ESCollection
|
|
14
16
|
from howler.datastore.exceptions import DataStoreException
|
|
15
17
|
from howler.odm.models.config import Config
|
|
16
18
|
from howler.odm.models.config import config as _config
|
|
17
19
|
|
|
18
20
|
TRANSPORT_TIMEOUT = int(environ.get("HWL_DATASTORE_TRANSPORT_TIMEOUT", "10"))
|
|
21
|
+
CERTS_PATH = Path(os.environ.get("HWL_CERT_DIRECTORY", "/etc/howler/certs"))
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger("howler.datastore.store")
|
|
24
|
+
logger.setLevel(logging.INFO)
|
|
25
|
+
console = logging.StreamHandler()
|
|
26
|
+
console.setLevel(logging.INFO)
|
|
27
|
+
console.setFormatter(logging.Formatter(HWL_LOG_FORMAT, HWL_DATE_FORMAT))
|
|
28
|
+
logger.addHandler(console)
|
|
19
29
|
|
|
20
30
|
|
|
21
31
|
class ESStore(object):
|
|
@@ -58,9 +68,22 @@ class ESStore(object):
|
|
|
58
68
|
self._username: Optional[str] = None
|
|
59
69
|
self._password: Optional[str] = None
|
|
60
70
|
self._hosts = []
|
|
71
|
+
self._cert: str | None = None
|
|
61
72
|
|
|
62
73
|
for host in config.datastore.hosts:
|
|
63
74
|
self._hosts.append(str(host))
|
|
75
|
+
|
|
76
|
+
cert = CERTS_PATH / f"{host.name}.crt"
|
|
77
|
+
if cert.exists():
|
|
78
|
+
if self._cert is None:
|
|
79
|
+
self._cert = str(cert)
|
|
80
|
+
else:
|
|
81
|
+
logger.error("Only a single certificate path is supported - ignoring additional paths.")
|
|
82
|
+
logger.error(
|
|
83
|
+
"If you have multiple certificates, bundle them into a single .pem file and specify "
|
|
84
|
+
"it for the first host."
|
|
85
|
+
)
|
|
86
|
+
|
|
64
87
|
if os.getenv(f"{host.name.upper()}_HOST_APIKEY_ID", None) is not None:
|
|
65
88
|
self._apikey = (
|
|
66
89
|
os.environ[f"{host.name.upper()}_HOST_APIKEY_ID"],
|
|
@@ -81,6 +104,7 @@ class ESStore(object):
|
|
|
81
104
|
if self._apikey is not None:
|
|
82
105
|
self.client = elasticsearch.Elasticsearch(
|
|
83
106
|
hosts=self._hosts, # type: ignore
|
|
107
|
+
ca_certs=self._cert, # type: ignore
|
|
84
108
|
api_key=self._apikey,
|
|
85
109
|
max_retries=0,
|
|
86
110
|
request_timeout=TRANSPORT_TIMEOUT,
|
|
@@ -88,6 +112,7 @@ class ESStore(object):
|
|
|
88
112
|
elif self._username is not None and self._password is not None:
|
|
89
113
|
self.client = elasticsearch.Elasticsearch(
|
|
90
114
|
hosts=self._hosts, # type: ignore
|
|
115
|
+
ca_certs=self._cert, # type: ignore
|
|
91
116
|
basic_auth=(self._username, self._password),
|
|
92
117
|
max_retries=0,
|
|
93
118
|
request_timeout=TRANSPORT_TIMEOUT,
|
|
@@ -95,6 +120,7 @@ class ESStore(object):
|
|
|
95
120
|
else:
|
|
96
121
|
self.client = elasticsearch.Elasticsearch(
|
|
97
122
|
hosts=self._hosts, # type: ignore
|
|
123
|
+
ca_certs=self._cert, # type: ignore
|
|
98
124
|
max_retries=0,
|
|
99
125
|
request_timeout=TRANSPORT_TIMEOUT,
|
|
100
126
|
)
|
|
@@ -23,7 +23,7 @@ class Comment(odm.Model):
|
|
|
23
23
|
)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
DEFAULT_TRIAGE = {"skip_rationale": False, "valid_assessments": Assessment.list()}
|
|
26
|
+
DEFAULT_TRIAGE = {"skip_rationale": False, "valid_assessments": Assessment.list(), "rationales": []}
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
@odm.model(index=True, store=True, description="Settings for triaging this analytic.")
|
|
@@ -40,6 +40,11 @@ class TriageOptions(odm.Model):
|
|
|
40
40
|
dossiers: list[str] = odm.List(
|
|
41
41
|
odm.Keyword(), description="A list of dossiers to present to the user when triaging alerts.", default=[]
|
|
42
42
|
)
|
|
43
|
+
rationales: list[str] = odm.List(
|
|
44
|
+
odm.Keyword(),
|
|
45
|
+
default=DEFAULT_TRIAGE["rationales"],
|
|
46
|
+
description="A provided list of rationales that will be suggested when triaging alerts.",
|
|
47
|
+
)
|
|
43
48
|
|
|
44
49
|
|
|
45
50
|
@odm.model(index=True, store=True, description="Notebook data")
|
|
@@ -148,7 +148,7 @@ suppress-none-returning = true
|
|
|
148
148
|
[tool.poetry]
|
|
149
149
|
package-mode = true
|
|
150
150
|
name = "howler-api"
|
|
151
|
-
version = "3.1.0.
|
|
151
|
+
version = "3.1.0.dev391"
|
|
152
152
|
description = "Howler - API server"
|
|
153
153
|
authors = [
|
|
154
154
|
"Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/datastore/migrations/fix_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/queues/priority.py
RENAMED
|
File without changes
|
|
File without changes
|
{howler_api-3.1.0.dev388 → howler_api-3.1.0.dev391}/howler/remote/datatypes/user_quota_tracker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|