howler-api 3.4.0.dev852__tar.gz → 3.4.0.dev895__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.
Files changed (202) hide show
  1. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/PKG-INFO +1 -1
  2. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/store.py +123 -34
  3. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/pyproject.toml +1 -1
  4. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/README.md +0 -0
  5. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/__init__.py +0 -0
  6. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/__init__.py +0 -0
  7. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/add_label.py +0 -0
  8. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/add_to_bundle.py +0 -0
  9. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/change_field.py +0 -0
  10. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/demote.py +0 -0
  11. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/example_plugin.py +0 -0
  12. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/prioritization.py +0 -0
  13. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/promote.py +0 -0
  14. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/remove_from_bundle.py +0 -0
  15. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/remove_label.py +0 -0
  16. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/actions/transition.py +0 -0
  17. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/__init__.py +0 -0
  18. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/base.py +0 -0
  19. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/socket.py +0 -0
  20. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/__init__.py +0 -0
  21. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/action.py +0 -0
  22. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/analytic.py +0 -0
  23. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/auth.py +0 -0
  24. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/clue.py +0 -0
  25. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/configs.py +0 -0
  26. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/dossier.py +0 -0
  27. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/help.py +0 -0
  28. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/hit.py +0 -0
  29. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/notebook.py +0 -0
  30. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/overview.py +0 -0
  31. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/search.py +0 -0
  32. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/template.py +0 -0
  33. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/tool.py +0 -0
  34. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/user.py +0 -0
  35. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/utils/__init__.py +0 -0
  36. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/utils/etag.py +0 -0
  37. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/api/v1/view.py +0 -0
  38. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/app.py +0 -0
  39. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/README.md +0 -0
  40. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/__init__.py +0 -0
  41. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/classification.py +0 -0
  42. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/classification.yml +0 -0
  43. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/exceptions.py +0 -0
  44. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/loader.py +0 -0
  45. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/logging/__init__.py +0 -0
  46. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/logging/audit.py +0 -0
  47. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/logging/format.py +0 -0
  48. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/net.py +0 -0
  49. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/net_static.py +0 -0
  50. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/random_user.py +0 -0
  51. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/common/swagger.py +0 -0
  52. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/config.py +0 -0
  53. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/cronjobs/__init__.py +0 -0
  54. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/cronjobs/retention.py +0 -0
  55. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/cronjobs/rules.py +0 -0
  56. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/cronjobs/view_cleanup.py +0 -0
  57. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/README.md +0 -0
  58. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/__init__.py +0 -0
  59. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/bulk.py +0 -0
  60. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/collection.py +0 -0
  61. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/constants.py +0 -0
  62. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/exceptions.py +0 -0
  63. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/howler_store.py +0 -0
  64. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/migrations/fix_process.py +0 -0
  65. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/operations.py +0 -0
  66. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/schemas.py +0 -0
  67. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/support/__init__.py +0 -0
  68. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/support/build.py +0 -0
  69. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/support/schemas.py +0 -0
  70. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/datastore/types.py +0 -0
  71. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/error.py +0 -0
  72. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/README.md +0 -0
  73. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/__init__.py +0 -0
  74. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/generate_mitre.py +0 -0
  75. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/generate_sigma_rules.py +0 -0
  76. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/generate_tlds.py +0 -0
  77. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/reindex_data.py +0 -0
  78. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/external/wipe_databases.py +0 -0
  79. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/gunicorn_config.py +0 -0
  80. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/healthz.py +0 -0
  81. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/__init__.py +0 -0
  82. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/azure.py +0 -0
  83. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/discover.py +0 -0
  84. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/hit.py +0 -0
  85. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/oauth.py +0 -0
  86. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/search.py +0 -0
  87. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/workflow.py +0 -0
  88. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/helper/ws.py +0 -0
  89. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/README.md +0 -0
  90. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/__init__.py +0 -0
  91. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/base.py +0 -0
  92. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/charter.txt +0 -0
  93. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/helper.py +0 -0
  94. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/howler_enum.py +0 -0
  95. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/__init__.py +0 -0
  96. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/action.py +0 -0
  97. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/analytic.py +0 -0
  98. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/assemblyline.py +0 -0
  99. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/aws.py +0 -0
  100. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/azure.py +0 -0
  101. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/cbs.py +0 -0
  102. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/clue.py +0 -0
  103. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/config.py +0 -0
  104. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/dossier.py +0 -0
  105. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/__init__.py +0 -0
  106. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/agent.py +0 -0
  107. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/autonomous_system.py +0 -0
  108. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/client.py +0 -0
  109. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/cloud.py +0 -0
  110. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/code_signature.py +0 -0
  111. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/container.py +0 -0
  112. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/dns.py +0 -0
  113. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/egress.py +0 -0
  114. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/elf.py +0 -0
  115. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/email.py +0 -0
  116. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/error.py +0 -0
  117. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/event.py +0 -0
  118. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/faas.py +0 -0
  119. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/file.py +0 -0
  120. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/geo.py +0 -0
  121. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/group.py +0 -0
  122. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/hash.py +0 -0
  123. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/host.py +0 -0
  124. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/http.py +0 -0
  125. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/ingress.py +0 -0
  126. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/interface.py +0 -0
  127. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/network.py +0 -0
  128. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/observer.py +0 -0
  129. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/organization.py +0 -0
  130. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/os.py +0 -0
  131. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/pe.py +0 -0
  132. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/process.py +0 -0
  133. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/registry.py +0 -0
  134. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/related.py +0 -0
  135. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/rule.py +0 -0
  136. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/server.py +0 -0
  137. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/threat.py +0 -0
  138. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/tls.py +0 -0
  139. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/url.py +0 -0
  140. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/user.py +0 -0
  141. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/user_agent.py +0 -0
  142. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/ecs/vulnerability.py +0 -0
  143. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/gcp.py +0 -0
  144. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/hit.py +0 -0
  145. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/howler_data.py +0 -0
  146. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/lead.py +0 -0
  147. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/localized_label.py +0 -0
  148. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/overview.py +0 -0
  149. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/pivot.py +0 -0
  150. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/template.py +0 -0
  151. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/user.py +0 -0
  152. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/models/view.py +0 -0
  153. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/random_data.py +0 -0
  154. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/odm/randomizer.py +0 -0
  155. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/patched.py +0 -0
  156. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/plugins/__init__.py +0 -0
  157. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/plugins/config.py +0 -0
  158. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/__init__.py +0 -0
  159. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/README.md +0 -0
  160. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/__init__.py +0 -0
  161. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/counters.py +0 -0
  162. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/events.py +0 -0
  163. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/hash.py +0 -0
  164. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/lock.py +0 -0
  165. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/queues/__init__.py +0 -0
  166. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/queues/comms.py +0 -0
  167. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/queues/multi.py +0 -0
  168. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/queues/named.py +0 -0
  169. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/queues/priority.py +0 -0
  170. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/set.py +0 -0
  171. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  172. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/security/__init__.py +0 -0
  173. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/security/socket.py +0 -0
  174. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/security/utils.py +0 -0
  175. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/__init__.py +0 -0
  176. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/action_service.py +0 -0
  177. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/analytic_service.py +0 -0
  178. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/auth_service.py +0 -0
  179. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/config_service.py +0 -0
  180. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/dossier_service.py +0 -0
  181. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/event_service.py +0 -0
  182. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/hit_service.py +0 -0
  183. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/jwt_service.py +0 -0
  184. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/lucene_service.py +0 -0
  185. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/notebook_service.py +0 -0
  186. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/overview_service.py +0 -0
  187. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/template_service.py +0 -0
  188. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/services/user_service.py +0 -0
  189. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/telemetry.py +0 -0
  190. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/__init__.py +0 -0
  191. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/annotations.py +0 -0
  192. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/chunk.py +0 -0
  193. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/compat.py +0 -0
  194. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/constants.py +0 -0
  195. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/dict_utils.py +0 -0
  196. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/isotime.py +0 -0
  197. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/list_utils.py +0 -0
  198. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/lucene.py +0 -0
  199. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/path.py +0 -0
  200. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/socket_utils.py +0 -0
  201. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/str_utils.py +0 -0
  202. {howler_api-3.4.0.dev852 → howler_api-3.4.0.dev895}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 3.4.0.dev852
3
+ Version: 3.4.0.dev895
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -28,7 +28,18 @@ logger.addHandler(console)
28
28
 
29
29
 
30
30
  class ESStore(object):
31
- """Elasticsearch multi-index implementation of the ResultStore interface."""
31
+ """Elasticsearch multi-index datastore backed by one or more ES hosts.
32
+
33
+ Manages connections, collection caching, model registration, and date-math
34
+ helpers for Howler's Elasticsearch indices.
35
+
36
+ Attributes:
37
+ DEFAULT_SORT: Default sort order for queries.
38
+ DATE_FORMAT: Mapping of abstract time-unit names to ES date-math tokens.
39
+ DATEMATH_MAP: Mapping used by ``to_pydatemath`` to convert internal
40
+ date-math expressions into ES-compatible strings.
41
+ ID: Name of the document identifier field.
42
+ """
32
43
 
33
44
  DEFAULT_SORT = "id asc"
34
45
  DATE_FORMAT = {
@@ -60,6 +71,18 @@ class ESStore(object):
60
71
  ID = "id"
61
72
 
62
73
  def __init__(self, config: Optional[Config] = None, archive_access=True):
74
+ """Initialise the store and open an Elasticsearch connection.
75
+
76
+ Host addresses, TLS certificates, API keys, and basic-auth credentials
77
+ are resolved from the supplied ``config`` and from environment variables
78
+ named ``<HOST>_HOST_APIKEY_ID`` / ``<HOST>_HOST_APIKEY_SECRET`` or
79
+ ``<HOST>_HOST_USERNAME`` / ``<HOST>_HOST_PASSWORD``.
80
+
81
+ Args:
82
+ config: Application configuration. Falls back to the global
83
+ ``howler.odm.models.config.config`` singleton when ``None``.
84
+ archive_access: Whether archive indices should be accessible.
85
+ """
63
86
  if not config:
64
87
  config = _config
65
88
 
@@ -111,32 +134,7 @@ class ESStore(object):
111
134
  tracer = logging.getLogger("elasticsearch")
112
135
  tracer.setLevel(logging.CRITICAL)
113
136
 
114
- if self._apikey is not None:
115
- self.client = elasticsearch.Elasticsearch(
116
- hosts=self._hosts, # type: ignore
117
- ca_certs=self._cert, # type: ignore
118
- ssl_assert_fingerprint=self._fingerprint, # type: ignore
119
- api_key=self._apikey,
120
- max_retries=0,
121
- request_timeout=TRANSPORT_TIMEOUT,
122
- )
123
- elif self._username is not None and self._password is not None:
124
- self.client = elasticsearch.Elasticsearch(
125
- hosts=self._hosts, # type: ignore
126
- ca_certs=self._cert, # type: ignore
127
- ssl_assert_fingerprint=self._fingerprint, # type: ignore
128
- basic_auth=(self._username, self._password),
129
- max_retries=0,
130
- request_timeout=TRANSPORT_TIMEOUT,
131
- )
132
- else:
133
- self.client = elasticsearch.Elasticsearch(
134
- hosts=self._hosts, # type: ignore
135
- ca_certs=self._cert, # type: ignore
136
- ssl_assert_fingerprint=self._fingerprint, # type: ignore
137
- max_retries=0,
138
- request_timeout=TRANSPORT_TIMEOUT,
139
- )
137
+ self.client = self.__build_connection()
140
138
  self.archive_access = archive_access
141
139
  self.url_path = "elastic"
142
140
 
@@ -149,7 +147,24 @@ class ESStore(object):
149
147
  def __str__(self):
150
148
  return "{0} - {1}".format(self.__class__.__name__, self._hosts)
151
149
 
152
- def __getattr__(self, name) -> ESCollection:
150
+ def __getitem__(self, name: str) -> ESCollection:
151
+ return self.__getattr__(name)
152
+
153
+ def __getattr__(self, name: str) -> ESCollection:
154
+ """Return the ``ESCollection`` registered under *name*.
155
+
156
+ Collections are cached after the first access when validation is
157
+ enabled.
158
+
159
+ Args:
160
+ name: Registered collection (index) name.
161
+
162
+ Returns:
163
+ The ``ESCollection`` instance for *name*.
164
+
165
+ Raises:
166
+ KeyError: If *name* has not been registered via ``register``.
167
+ """
153
168
  if not self.validate:
154
169
  return ESCollection(self, name, model_class=self._models[name], validate=self.validate)
155
170
 
@@ -206,21 +221,67 @@ class ESStore(object):
206
221
  def date_separator(self):
207
222
  return self.DATE_FORMAT["SEPARATOR"]
208
223
 
224
+ def __build_connection(self) -> elasticsearch.Elasticsearch:
225
+ """Create a new ``Elasticsearch`` client from stored credentials.
226
+
227
+ Authentication is selected automatically: API-key auth is preferred,
228
+ then basic auth, then anonymous.
229
+
230
+ Returns:
231
+ A freshly constructed ``Elasticsearch`` client.
232
+ """
233
+ if self._apikey is not None:
234
+ return elasticsearch.Elasticsearch(
235
+ hosts=self._hosts, # type: ignore
236
+ ca_certs=self._cert, # type: ignore
237
+ ssl_assert_fingerprint=self._fingerprint, # type: ignore
238
+ api_key=self._apikey,
239
+ max_retries=0,
240
+ request_timeout=TRANSPORT_TIMEOUT,
241
+ )
242
+ elif self._username is not None and self._password is not None:
243
+ return elasticsearch.Elasticsearch(
244
+ hosts=self._hosts, # type: ignore
245
+ ca_certs=self._cert, # type: ignore
246
+ ssl_assert_fingerprint=self._fingerprint, # type: ignore
247
+ basic_auth=(self._username, self._password),
248
+ max_retries=0,
249
+ request_timeout=TRANSPORT_TIMEOUT,
250
+ )
251
+ else:
252
+ return elasticsearch.Elasticsearch(
253
+ hosts=self._hosts, # type: ignore
254
+ ca_certs=self._cert, # type: ignore
255
+ ssl_assert_fingerprint=self._fingerprint, # type: ignore
256
+ max_retries=0,
257
+ request_timeout=TRANSPORT_TIMEOUT,
258
+ )
259
+
209
260
  def connection_reset(self):
210
- self.client = elasticsearch.Elasticsearch(
211
- hosts=self._hosts, # type: ignore
212
- api_key=self._apikey,
213
- max_retries=0,
214
- request_timeout=TRANSPORT_TIMEOUT,
215
- )
261
+ """Replace the current ES client with a fresh connection."""
262
+ self.client = self.__build_connection()
216
263
 
217
264
  def close(self):
265
+ """Mark the store as closed and release the ES client.
266
+
267
+ After calling this method any attempt to use the client will raise
268
+ an ``AttributeError``.
269
+ """
218
270
  self._closed = True
219
271
  # Flatten the client object so that attempts to access without reconnecting errors hard
220
272
  # But 'cast' it so that mypy and other linters don't think that its normal for client to be None
221
273
  self.client = cast(elasticsearch.Elasticsearch, None)
222
274
 
223
275
  def get_hosts(self, safe=False):
276
+ """Return the list of configured ES host addresses.
277
+
278
+ Args:
279
+ safe: When ``True``, strip the scheme and port from each URL and
280
+ return only hostnames.
281
+
282
+ Returns:
283
+ A list of host strings.
284
+ """
224
285
  if not safe:
225
286
  return self._hosts
226
287
  else:
@@ -231,15 +292,33 @@ class ESStore(object):
231
292
  return out
232
293
 
233
294
  def get_models(self):
295
+ """Return the mapping of registered collection names to model classes."""
234
296
  return self._models
235
297
 
236
298
  def is_closed(self):
299
+ """Return ``True`` if the store has been closed."""
237
300
  return self._closed
238
301
 
239
302
  def ping(self):
303
+ """Ping the Elasticsearch cluster.
304
+
305
+ Returns:
306
+ ``True`` if the cluster responded successfully.
307
+ """
240
308
  return self.client.ping()
241
309
 
242
310
  def register(self, name: str, model_class=None):
311
+ """Register a collection (index) name and its optional ODM model class.
312
+
313
+ Args:
314
+ name: Collection name. Must contain only lowercase letters, digits,
315
+ and underscores.
316
+ model_class: ODM model class used for validation and serialisation.
317
+ ``None`` disables model-level validation for this collection.
318
+
319
+ Raises:
320
+ DataStoreException: If *name* contains invalid characters.
321
+ """
243
322
  name_match = re.match(r"[a-z0-9_]*", name)
244
323
  if not name_match or name_match.string != name:
245
324
  raise DataStoreException(
@@ -249,6 +328,16 @@ class ESStore(object):
249
328
  self._models[name] = model_class
250
329
 
251
330
  def to_pydatemath(self, value):
331
+ """Convert an internal date-math expression to ES date-math syntax.
332
+
333
+ Args:
334
+ value: String containing abstract date-math tokens (e.g.
335
+ ``"NOW-1DAY"``).
336
+
337
+ Returns:
338
+ The equivalent Elasticsearch date-math string (e.g.
339
+ ``"now-1d"``).
340
+ """
252
341
  replace_list = [
253
342
  (self.now, self.DATEMATH_MAP["NOW"]),
254
343
  (self.year, self.DATEMATH_MAP["YEAR"]),
@@ -152,7 +152,7 @@ suppress-none-returning = true
152
152
  [tool.poetry]
153
153
  package-mode = true
154
154
  name = "howler-api"
155
- version = "3.4.0.dev852"
155
+ version = "3.4.0.dev895"
156
156
  description = "Howler - API server"
157
157
  authors = [
158
158
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",