howler-api 4.1.0.dev1573__tar.gz → 4.1.0.dev1582__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-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/PKG-INFO +1 -1
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/action.py +29 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/__init__.py +6 -1
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/hash.py +5 -5
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/lock.py +4 -4
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/priority.py +3 -3
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/set.py +4 -4
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/user_quota_tracker.py +3 -3
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/action_service.py +36 -1
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/pyproject.toml +1 -1
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_label.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_to_bundle.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/add_to_case.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/change_field.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/demote.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/example_plugin.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/prioritization.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/promote.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/remove_from_bundle.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/remove_label.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/actions/transition.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/base.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/socket.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/analytic.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/auth.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/clue.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/configs.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/dossier.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/help.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/hit.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/notebook.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/overview.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/search.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/template.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/tool.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/user.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/etag.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/utils/params.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v1/view.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/case.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/fuzzy.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/ingest.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/api/v2/search.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/app.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/classification.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/classification.yml +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/exceptions.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/loader.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/audit.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/logging/format.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/net.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/net_static.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/random_user.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/common/swagger.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/config.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/action_queue_worker.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/correlation.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/retention.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/view_cleanup.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/bulk.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/collection.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/constants.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/exceptions.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/howler_store.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/migrations/fix_process.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/operations.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/schemas.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/store.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/build.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/support/schemas.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/types.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/datastore/utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/error.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/check_duplicates.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_mitre.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_sigma_rules.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_tlds.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/reindex_data.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/wipe_databases.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/gunicorn_config.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/healthz.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/azure.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/discover.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/hit.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/oauth.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/search.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/workflow.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/helper/ws.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/base.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/charter.txt +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/constants.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/helper.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/howler_enum.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/mixins.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/action.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/analytic.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/assemblyline.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/aws.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/azure.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/case.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/cbs.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/clue.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/config.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/dossier.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/agent.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/autonomous_system.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/client.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/cloud.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/code_signature.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/container.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/dns.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/egress.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/elf.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/email.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/error.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/event.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/faas.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/file.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/geo.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/group.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/hash.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/host.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/http.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/ingress.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/interface.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/network.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/observer.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/organization.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/os.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/pe.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/process.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/registry.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/related.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/rule.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/server.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/threat.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/tls.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/url.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/user.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/user_agent.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/vulnerability.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/event.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/gcp.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/hit.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/howler_data.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/lead.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/localized_label.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/overview.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/pivot.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/record.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/template.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/user.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/view.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/random_data.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/randomizer.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/patched.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/plugins/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/plugins/config.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/README.md +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/counters.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/events.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/comms.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/multi.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/named.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/login.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/socket.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/security/utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/analytic_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/auth_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/bundle_compat_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/case_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/comms_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/config_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/correlation_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/docs_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/dossier_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/event_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/fuzzy_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/hit_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/jwt_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/lucene_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/notebook_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/overview_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/search_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/template_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/user_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/viewer_service.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/telemetry.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/__init__.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/annotations.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/chunk.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/compat.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/constants.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/dict_utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/indexes.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/isotime.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/list_utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/lucene.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/net_utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/path.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/socket_utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/str_utils.py +0 -0
- {howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/utils/uid.py +0 -0
|
@@ -4,6 +4,7 @@ from flask import Response, request
|
|
|
4
4
|
|
|
5
5
|
import howler.actions as actions
|
|
6
6
|
from howler.api import bad_request, created, forbidden, internal_error, make_subapi_blueprint, no_content, not_found, ok
|
|
7
|
+
from howler.api.v1.utils.etag import add_etag
|
|
7
8
|
from howler.api.v1.utils.params import parse_parameters, parse_refresh
|
|
8
9
|
from howler.common.exceptions import HowlerException
|
|
9
10
|
from howler.common.loader import datastore
|
|
@@ -46,6 +47,34 @@ def get_actions(**_) -> Response:
|
|
|
46
47
|
return ok(datastore().action.search("*:*", as_obj=False)["items"])
|
|
47
48
|
|
|
48
49
|
|
|
50
|
+
@generate_swagger_docs()
|
|
51
|
+
@action_api.route("/<id>", methods=["GET"])
|
|
52
|
+
@api_login(
|
|
53
|
+
audit=True,
|
|
54
|
+
check_xsrf_token=False,
|
|
55
|
+
required_type=["admin", "automation_basic", "automation_advanced", "actionrunner_basic", "actionrunner_advanced"],
|
|
56
|
+
)
|
|
57
|
+
@add_etag(getter=action_service.get_action)
|
|
58
|
+
def get_action(id: str, record: Action | None, server_version: str, **kwargs) -> Response | tuple[Response, str]:
|
|
59
|
+
"""Get an existing action.
|
|
60
|
+
|
|
61
|
+
Variables:
|
|
62
|
+
id => The id of the action to retrieve
|
|
63
|
+
|
|
64
|
+
Optional Arguments:
|
|
65
|
+
None
|
|
66
|
+
|
|
67
|
+
Result Example:
|
|
68
|
+
{
|
|
69
|
+
...action # The requested action
|
|
70
|
+
}
|
|
71
|
+
"""
|
|
72
|
+
if not record:
|
|
73
|
+
return not_found(err="The specified action does not exist")
|
|
74
|
+
|
|
75
|
+
return ok(record), server_version
|
|
76
|
+
|
|
77
|
+
|
|
49
78
|
@generate_swagger_docs()
|
|
50
79
|
@action_api.route("/", methods=["POST"])
|
|
51
80
|
@api_login(audit=False, check_xsrf_token=False, required_type=["admin", "automation_basic", "automation_advanced"])
|
|
@@ -7,7 +7,7 @@ import socket
|
|
|
7
7
|
import time
|
|
8
8
|
from datetime import datetime, timezone
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any, Protocol
|
|
11
11
|
|
|
12
12
|
import redis
|
|
13
13
|
from packaging.version import parse
|
|
@@ -29,6 +29,11 @@ if parse(redis.__version__) <= parse("2.10.0"):
|
|
|
29
29
|
|
|
30
30
|
APP_NAME = os.environ.get("APP_NAME", "howler")
|
|
31
31
|
|
|
32
|
+
|
|
33
|
+
class RedisScriptClient(Protocol):
|
|
34
|
+
def register_script(self, script: str) -> Any: ...
|
|
35
|
+
|
|
36
|
+
|
|
32
37
|
log = logging.getLogger(f"{APP_NAME}.queue")
|
|
33
38
|
pool: dict[tuple[str, str, bool], redis.BlockingConnectionPool] = {}
|
|
34
39
|
|
|
@@ -2,12 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import time
|
|
5
|
-
from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar, cast
|
|
6
6
|
|
|
7
7
|
from redis import RedisCluster
|
|
8
8
|
|
|
9
9
|
from howler.common.exceptions import HowlerValueError
|
|
10
|
-
from howler.remote.datatypes import get_client, retry_call
|
|
10
|
+
from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from redis import Redis
|
|
@@ -78,9 +78,9 @@ class Hash(Generic[T]):
|
|
|
78
78
|
):
|
|
79
79
|
self.c: Any = get_client(host, port, False)
|
|
80
80
|
self.name = name
|
|
81
|
-
self._pop = self.c.register_script(h_pop_script)
|
|
82
|
-
self._limited_add = self.c.register_script(_limited_add)
|
|
83
|
-
self._conditional_remove = self.c.register_script(_conditional_remove_script)
|
|
81
|
+
self._pop = cast(RedisScriptClient, self.c).register_script(h_pop_script)
|
|
82
|
+
self._limited_add = cast(RedisScriptClient, self.c).register_script(_limited_add)
|
|
83
|
+
self._conditional_remove = cast(RedisScriptClient, self.c).register_script(_conditional_remove_script)
|
|
84
84
|
|
|
85
85
|
def __iter__(self):
|
|
86
86
|
return HashIterator(self)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from typing import Any
|
|
1
|
+
from typing import Any, cast
|
|
2
2
|
|
|
3
|
-
from howler.remote.datatypes import get_client, retry_call
|
|
3
|
+
from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
|
|
4
4
|
from howler.utils.uid import get_random_id
|
|
5
5
|
|
|
6
6
|
lock_acquire_script = """
|
|
@@ -33,8 +33,8 @@ class Lock(object):
|
|
|
33
33
|
self.lock_release = "-".join(("lock", str(timeout), name, "released"))
|
|
34
34
|
self.lock_holder = "-".join(("lock", str(timeout), name, "holder"))
|
|
35
35
|
self.timeout = timeout
|
|
36
|
-
self._acquire = self.c.register_script(lock_acquire_script)
|
|
37
|
-
self._release = self.c.register_script(lock_release_script)
|
|
36
|
+
self._acquire = cast(RedisScriptClient, self.c).register_script(lock_acquire_script)
|
|
37
|
+
self._release = cast(RedisScriptClient, self.c).register_script(lock_release_script)
|
|
38
38
|
|
|
39
39
|
def __enter__(self):
|
|
40
40
|
while not retry_call(self._acquire, args=[self.lock_holder, self.uuid, self.timeout]):
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/priority.py
RENAMED
|
@@ -2,10 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import time
|
|
5
|
-
from typing import Any, Generic, Optional, TypeVar, Union
|
|
5
|
+
from typing import Any, Generic, Optional, TypeVar, Union, cast
|
|
6
6
|
|
|
7
7
|
from howler.common.exceptions import HowlerTypeError
|
|
8
|
-
from howler.remote.datatypes import decode, get_client, retry_call
|
|
8
|
+
from howler.remote.datatypes import RedisScriptClient, decode, get_client, retry_call
|
|
9
9
|
|
|
10
10
|
SORTING_KEY_LEN = 21
|
|
11
11
|
|
|
@@ -37,7 +37,7 @@ T = TypeVar("T")
|
|
|
37
37
|
class PriorityQueue(Generic[T]):
|
|
38
38
|
def __init__(self, name, host=None, port=None, private=False):
|
|
39
39
|
self.c: Any = get_client(host, port, private)
|
|
40
|
-
self._deque_range = self.c.register_script(pq_dequeue_range_script)
|
|
40
|
+
self._deque_range = cast(RedisScriptClient, self.c).register_script(pq_dequeue_range_script)
|
|
41
41
|
self.name = name
|
|
42
42
|
|
|
43
43
|
def __enter__(self):
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import time
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any, cast
|
|
4
4
|
|
|
5
|
-
from howler.remote.datatypes import get_client, retry_call
|
|
5
|
+
from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
|
|
6
6
|
|
|
7
7
|
_drop_card_script = """
|
|
8
8
|
local set_name = ARGV[1]
|
|
@@ -29,8 +29,8 @@ class Set(object):
|
|
|
29
29
|
def __init__(self, name, host=None, port=None):
|
|
30
30
|
self.c: Any = get_client(host, port, False)
|
|
31
31
|
self.name = name
|
|
32
|
-
self._drop_card = self.c.register_script(_drop_card_script)
|
|
33
|
-
self._limited_add = self.c.register_script(_limited_add)
|
|
32
|
+
self._drop_card = cast(RedisScriptClient, self.c).register_script(_drop_card_script)
|
|
33
|
+
self._limited_add = cast(RedisScriptClient, self.c).register_script(_limited_add)
|
|
34
34
|
|
|
35
35
|
def __enter__(self):
|
|
36
36
|
return self
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/user_quota_tracker.py
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from typing import Any
|
|
1
|
+
from typing import Any, cast
|
|
2
2
|
|
|
3
3
|
from redis.exceptions import ResponseError
|
|
4
4
|
|
|
5
|
-
from howler.remote.datatypes import get_client, retry_call
|
|
5
|
+
from howler.remote.datatypes import RedisScriptClient, get_client, retry_call
|
|
6
6
|
|
|
7
7
|
begin_script = """
|
|
8
8
|
local t = redis.call('time')
|
|
@@ -25,7 +25,7 @@ end
|
|
|
25
25
|
class UserQuotaTracker(object):
|
|
26
26
|
def __init__(self, prefix, timeout=120, redis=None, host=None, port=None, private=False):
|
|
27
27
|
self.c: Any = redis or get_client(host, port, private)
|
|
28
|
-
self.bs = self.c.register_script(begin_script)
|
|
28
|
+
self.bs = cast(RedisScriptClient, self.c).register_script(begin_script)
|
|
29
29
|
self.prefix = prefix
|
|
30
30
|
self.timeout = timeout
|
|
31
31
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from collections import defaultdict
|
|
3
3
|
from importlib.util import find_spec
|
|
4
|
-
from typing import Any, Optional, TypedDict
|
|
4
|
+
from typing import Any, Literal, Optional, TypedDict, overload
|
|
5
5
|
|
|
6
6
|
from cryptography.exceptions import InvalidTag
|
|
7
7
|
from flask import Response, has_request_context, request
|
|
@@ -35,6 +35,41 @@ class TriggeredAction(TypedDict):
|
|
|
35
35
|
_action_queues: dict[str, NamedQueue[TriggeredAction]] = {}
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
@overload
|
|
39
|
+
def get_action(
|
|
40
|
+
id: str, as_odm: Literal[True], version: Literal[True], user: User | None = None
|
|
41
|
+
) -> tuple[Action, str]: ...
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@overload
|
|
45
|
+
def get_action(id: str, as_odm: Literal[True], version: Literal[False]) -> Action: ...
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@overload
|
|
49
|
+
def get_action(id: str, as_odm: Literal[True]) -> Action: ...
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@overload
|
|
53
|
+
def get_action(id: str) -> Action: ...
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@overload
|
|
57
|
+
def get_action(id: str, as_odm: Literal[False], version: Literal[True]) -> tuple[dict[str, Any], str]: ...
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@overload
|
|
61
|
+
def get_action(id: str, as_odm: Literal[False], version: Literal[False]) -> dict[str, Any]: ...
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@overload
|
|
65
|
+
def get_action(id: str, as_odm: Literal[False]) -> dict[str, Any]: ...
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def get_action(id: str, as_odm=False, version=False, user: User | None = None):
|
|
69
|
+
"""Retrieve an action from the datastore as an ODM object or dictionary."""
|
|
70
|
+
return datastore().action.get_if_exists(key=id, as_obj=as_odm, version=version)
|
|
71
|
+
|
|
72
|
+
|
|
38
73
|
def _is_builtin_operation(operation_id: str) -> bool:
|
|
39
74
|
"""Return whether an operation is implemented by Howler's built-in actions package."""
|
|
40
75
|
return find_spec(f"howler.actions.{operation_id}") is not None
|
|
@@ -152,7 +152,7 @@ suppress-none-returning = true
|
|
|
152
152
|
[tool.poetry]
|
|
153
153
|
package-mode = true
|
|
154
154
|
name = "howler-api"
|
|
155
|
-
version = "4.1.0.
|
|
155
|
+
version = "4.1.0.dev1582"
|
|
156
156
|
description = "Howler - API server"
|
|
157
157
|
authors = [
|
|
158
158
|
"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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/cronjobs/action_queue_worker.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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/external/generate_sigma_rules.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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/autonomous_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/code_signature.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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/odm/models/ecs/vulnerability.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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/__init__.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/comms.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/multi.py
RENAMED
|
File without changes
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/remote/datatypes/queues/named.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
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/bundle_compat_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{howler_api-4.1.0.dev1573 → howler_api-4.1.0.dev1582}/howler/services/correlation_service.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
|