howler-api 2.13.0.dev345__tar.gz → 3.0.0.dev348__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.

Potentially problematic release.


This version of howler-api might be problematic. Click here for more details.

Files changed (200) hide show
  1. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/PKG-INFO +1 -1
  2. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/collection.py +3 -1
  3. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/constants.py +2 -0
  4. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/support/build.py +2 -1
  5. howler_api-3.0.0.dev348/howler/external/reindex_data.py +66 -0
  6. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/base.py +21 -0
  7. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/analytic.py +2 -2
  8. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/client.py +1 -1
  9. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/howler_data.py +13 -13
  10. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/view.py +1 -1
  11. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/randomizer.py +3 -0
  12. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/lucene.py +1 -1
  13. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/pyproject.toml +1 -1
  14. howler_api-2.13.0.dev345/howler/external/reindex_data.py +0 -46
  15. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/README.md +0 -0
  16. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/__init__.py +0 -0
  17. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/__init__.py +0 -0
  18. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/add_label.py +0 -0
  19. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/add_to_bundle.py +0 -0
  20. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/change_field.py +0 -0
  21. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/demote.py +0 -0
  22. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/example_plugin.py +0 -0
  23. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/prioritization.py +0 -0
  24. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/promote.py +0 -0
  25. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/remove_from_bundle.py +0 -0
  26. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/remove_label.py +0 -0
  27. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/actions/transition.py +0 -0
  28. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/__init__.py +0 -0
  29. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/base.py +0 -0
  30. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/socket.py +0 -0
  31. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/__init__.py +0 -0
  32. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/action.py +0 -0
  33. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/analytic.py +0 -0
  34. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/auth.py +0 -0
  35. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/clue.py +0 -0
  36. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/configs.py +0 -0
  37. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/dossier.py +0 -0
  38. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/help.py +0 -0
  39. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/hit.py +0 -0
  40. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/notebook.py +0 -0
  41. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/overview.py +0 -0
  42. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/search.py +0 -0
  43. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/template.py +0 -0
  44. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/tool.py +0 -0
  45. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/user.py +0 -0
  46. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/utils/__init__.py +0 -0
  47. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/utils/etag.py +0 -0
  48. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/api/v1/view.py +0 -0
  49. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/app.py +0 -0
  50. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/README.md +0 -0
  51. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/__init__.py +0 -0
  52. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/classification.py +0 -0
  53. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/classification.yml +0 -0
  54. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/exceptions.py +0 -0
  55. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/hexdump.py +0 -0
  56. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/iprange.py +0 -0
  57. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/loader.py +0 -0
  58. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/logging/__init__.py +0 -0
  59. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/logging/audit.py +0 -0
  60. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/logging/format.py +0 -0
  61. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/net.py +0 -0
  62. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/net_static.py +0 -0
  63. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/random_user.py +0 -0
  64. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/common/swagger.py +0 -0
  65. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/config.py +0 -0
  66. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/cronjobs/__init__.py +0 -0
  67. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/cronjobs/retention.py +0 -0
  68. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/cronjobs/rules.py +0 -0
  69. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/cronjobs/view_cleanup.py +0 -0
  70. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/README.md +0 -0
  71. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/__init__.py +0 -0
  72. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/bulk.py +0 -0
  73. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/exceptions.py +0 -0
  74. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/howler_store.py +0 -0
  75. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/migrations/fix_process.py +0 -0
  76. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/operations.py +0 -0
  77. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/schemas.py +0 -0
  78. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/store.py +0 -0
  79. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/support/__init__.py +0 -0
  80. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/support/schemas.py +0 -0
  81. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/datastore/types.py +0 -0
  82. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/error.py +0 -0
  83. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/external/__init__.py +0 -0
  84. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/external/generate_mitre.py +0 -0
  85. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/external/generate_sigma_rules.py +0 -0
  86. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/external/generate_tlds.py +0 -0
  87. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/external/wipe_databases.py +0 -0
  88. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/gunicorn_config.py +0 -0
  89. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/healthz.py +0 -0
  90. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/__init__.py +0 -0
  91. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/azure.py +0 -0
  92. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/discover.py +0 -0
  93. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/hit.py +0 -0
  94. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/oauth.py +0 -0
  95. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/search.py +0 -0
  96. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/workflow.py +0 -0
  97. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/helper/ws.py +0 -0
  98. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/README.md +0 -0
  99. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/__init__.py +0 -0
  100. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/charter.txt +0 -0
  101. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/helper.py +0 -0
  102. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/howler_enum.py +0 -0
  103. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/__init__.py +0 -0
  104. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/action.py +0 -0
  105. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/assemblyline.py +0 -0
  106. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/aws.py +0 -0
  107. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/azure.py +0 -0
  108. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/cbs.py +0 -0
  109. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/config.py +0 -0
  110. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/dossier.py +0 -0
  111. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/__init__.py +0 -0
  112. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/agent.py +0 -0
  113. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/autonomous_system.py +0 -0
  114. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/cloud.py +0 -0
  115. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/code_signature.py +0 -0
  116. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/container.py +0 -0
  117. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/dns.py +0 -0
  118. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/egress.py +0 -0
  119. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/elf.py +0 -0
  120. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/email.py +0 -0
  121. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/error.py +0 -0
  122. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/event.py +0 -0
  123. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/faas.py +0 -0
  124. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/file.py +0 -0
  125. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/geo.py +0 -0
  126. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/group.py +0 -0
  127. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/hash.py +0 -0
  128. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/host.py +0 -0
  129. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/http.py +0 -0
  130. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/ingress.py +0 -0
  131. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/interface.py +0 -0
  132. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/network.py +0 -0
  133. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/observer.py +0 -0
  134. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/organization.py +0 -0
  135. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/os.py +0 -0
  136. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/pe.py +0 -0
  137. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/process.py +0 -0
  138. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/registry.py +0 -0
  139. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/related.py +0 -0
  140. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/rule.py +0 -0
  141. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/server.py +0 -0
  142. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/threat.py +0 -0
  143. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/tls.py +0 -0
  144. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/url.py +0 -0
  145. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/user.py +0 -0
  146. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/user_agent.py +0 -0
  147. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/ecs/vulnerability.py +0 -0
  148. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/gcp.py +0 -0
  149. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/hit.py +0 -0
  150. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/lead.py +0 -0
  151. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/localized_label.py +0 -0
  152. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/overview.py +0 -0
  153. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/pivot.py +0 -0
  154. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/template.py +0 -0
  155. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/models/user.py +0 -0
  156. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/odm/random_data.py +0 -0
  157. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/patched.py +0 -0
  158. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/plugins/__init__.py +0 -0
  159. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/plugins/config.py +0 -0
  160. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/__init__.py +0 -0
  161. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/README.md +0 -0
  162. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/__init__.py +0 -0
  163. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/counters.py +0 -0
  164. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/events.py +0 -0
  165. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/hash.py +0 -0
  166. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/lock.py +0 -0
  167. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/queues/__init__.py +0 -0
  168. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/queues/comms.py +0 -0
  169. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/queues/multi.py +0 -0
  170. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/queues/named.py +0 -0
  171. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/queues/priority.py +0 -0
  172. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/set.py +0 -0
  173. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/remote/datatypes/user_quota_tracker.py +0 -0
  174. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/security/__init__.py +0 -0
  175. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/security/socket.py +0 -0
  176. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/security/utils.py +0 -0
  177. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/__init__.py +0 -0
  178. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/action_service.py +0 -0
  179. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/analytic_service.py +0 -0
  180. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/auth_service.py +0 -0
  181. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/config_service.py +0 -0
  182. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/dossier_service.py +0 -0
  183. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/event_service.py +0 -0
  184. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/hit_service.py +0 -0
  185. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/jwt_service.py +0 -0
  186. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/lucene_service.py +0 -0
  187. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/notebook_service.py +0 -0
  188. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/overview_service.py +0 -0
  189. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/template_service.py +0 -0
  190. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/services/user_service.py +0 -0
  191. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/__init__.py +0 -0
  192. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/annotations.py +0 -0
  193. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/chunk.py +0 -0
  194. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/dict_utils.py +0 -0
  195. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/isotime.py +0 -0
  196. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/list_utils.py +0 -0
  197. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/path.py +0 -0
  198. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/socket_utils.py +0 -0
  199. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/str_utils.py +0 -0
  200. {howler_api-2.13.0.dev345 → howler_api-3.0.0.dev348}/howler/utils/uid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howler-api
3
- Version: 2.13.0.dev345
3
+ Version: 3.0.0.dev348
4
4
  Summary: Howler - API server
5
5
  License: MIT
6
6
  Keywords: howler,alerting,gc,canada,cse-cst,cse,cst,cyber,cccs
@@ -207,6 +207,7 @@ class ESCollection(Generic[ModelType]):
207
207
  "script_fields": [],
208
208
  }
209
209
  IGNORE_ENSURE_COLLECTION = False
210
+ ENSURE_COLLECTION_WARNED = False
210
211
 
211
212
  def __init__(self, datastore: ESStore, name, model_class=None, validate=True, max_attempts=10):
212
213
  self.replicas = int(
@@ -227,9 +228,10 @@ class ESCollection(Generic[ModelType]):
227
228
 
228
229
  if not ESCollection.IGNORE_ENSURE_COLLECTION:
229
230
  self._ensure_collection()
230
- elif "pytest" not in sys.modules:
231
+ elif "pytest" not in sys.modules and not ESCollection.ENSURE_COLLECTION_WARNED:
231
232
  logger.warning("Skipping ensure collection! This is dangerous. Waiting five seconds before continuing.")
232
233
  time.sleep(5)
234
+ ESCollection.ENSURE_COLLECTION_WARNED = True
233
235
 
234
236
  self.stored_fields = {}
235
237
  if model_class:
@@ -21,6 +21,7 @@ from howler.odm import (
21
21
  Integer,
22
22
  Json,
23
23
  Keyword,
24
+ Long,
24
25
  LowerKeyword,
25
26
  PhoneNumber,
26
27
  Platform,
@@ -37,6 +38,7 @@ BASE_TYPE_MAPPING = {
37
38
  Keyword: "keyword",
38
39
  Boolean: "boolean",
39
40
  Integer: "integer",
41
+ Long: "long",
40
42
  Float: "float",
41
43
  Date: "date",
42
44
  Text: "text",
@@ -15,6 +15,7 @@ from howler.odm import (
15
15
  Json,
16
16
  Keyword,
17
17
  List,
18
+ Long,
18
19
  Mapping,
19
20
  Optional,
20
21
  Text,
@@ -57,7 +58,7 @@ def build_mapping(field_data, prefix=None, allow_refuse_implicit=True):
57
58
  }
58
59
  )
59
60
 
60
- elif isinstance(field, (Boolean, Integer, Float, Text)):
61
+ elif isinstance(field, (Boolean, Integer, Float, Text, Long)):
61
62
  mappings[name.strip(".")] = set_mapping(field, {"type": TYPE_MAPPING[field.__class__.__name__]})
62
63
 
63
64
  elif field.__class__ in ANALYZER_MAPPING:
@@ -0,0 +1,66 @@
1
+ import sys
2
+ import time
3
+ from typing import Callable
4
+
5
+ DELAY = 5
6
+
7
+
8
+ if __name__ == "__main__":
9
+ print("This script will allow you to reindex all indexes in elasticsearch.")
10
+ print("For obvious reasons, be EXTREMELY CAREFUL running this code.")
11
+
12
+ for i in range(DELAY):
13
+ print(f"Continuing in {str(DELAY - i)}...", end="\r")
14
+ time.sleep(1)
15
+ print()
16
+ answer = input("Are you sure you want to reindex data for an index in this cluster? [yes/NO]\n")
17
+
18
+ if not answer.startswith("y"):
19
+ print("Confirmation not provided, stopping.")
20
+ sys.exit(1)
21
+
22
+ from howler.datastore.collection import ESCollection
23
+
24
+ ESCollection.IGNORE_ENSURE_COLLECTION = True
25
+
26
+ from howler.common import loader
27
+
28
+ ds = loader.datastore(archive_access=False)
29
+
30
+ indexes: dict[str, tuple[list[str], Callable]] = {
31
+ "analytic": (ds.analytic.index_list_full, ds.analytic.reindex),
32
+ "hit": (ds.hit.index_list_full, ds.hit.reindex),
33
+ "view": (ds.view.index_list_full, ds.view.reindex),
34
+ "template": (ds.template.index_list_full, ds.template.reindex),
35
+ "overview": (ds.overview.index_list_full, ds.overview.reindex),
36
+ "action": (ds.action.index_list_full, ds.action.reindex),
37
+ "user": (ds.user.index_list_full, ds.user.reindex),
38
+ "dossier": (ds.dossier.index_list_full, ds.dossier.reindex),
39
+ }
40
+
41
+ print("Which index will you reindex?")
42
+ index_answer = input(", ".join(indexes.keys()) + "\n> ")
43
+
44
+ if index_answer not in indexes:
45
+ print("Invalid index provided, stopping.")
46
+ sys.exit(1)
47
+
48
+ print("You will be reindexing the following indexes:")
49
+ print("\n".join(indexes[index_answer][0]))
50
+
51
+ answer = input(("\nAre you sure you want to reindex these indexes? [yes/NO]\n"))
52
+ print()
53
+
54
+ if not answer.startswith("y"):
55
+ print("Confirmation not provided, stopping.")
56
+ sys.exit(1)
57
+
58
+ for i in range(2 * DELAY):
59
+ print(f"Reindexing in {2 * DELAY - i}...", end="\r")
60
+ time.sleep(1)
61
+
62
+ print()
63
+
64
+ result = indexes[index_answer][1]()
65
+
66
+ print(f"Reindex complete. Success: {result}.")
@@ -643,6 +643,27 @@ class Integer(_Field):
643
643
  raise HowlerValueError(f"[{'.'.join(context)}]: {str(e)}")
644
644
 
645
645
 
646
+ class Long(_Field):
647
+ """
648
+ A field storing a long value. Equivalent to Integer in python, but sets the ES datatype to long.
649
+
650
+ In Elasticsearch, Integer supports values from -2^31 to 2^31-1, while Long supports values from -2^63 to 2^63-1.
651
+ """
652
+
653
+ def check(self, value, context=[], **kwargs):
654
+ if self.optional and value is None:
655
+ return None
656
+
657
+ if value is None or value == "":
658
+ if self.default_set:
659
+ return self.default
660
+
661
+ try:
662
+ return int(value)
663
+ except ValueError as e:
664
+ raise HowlerValueError(f"[{'.'.join(context)}]: {str(e)}")
665
+
666
+
646
667
  class Float(_Field):
647
668
  """A field storing a floating point value."""
648
669
 
@@ -62,7 +62,7 @@ class Analytic(odm.Model):
62
62
  default=[],
63
63
  description="A list of useful notebooks for the analytic",
64
64
  )
65
- name: str = odm.Keyword(description="The name of the analytic.")
65
+ name: str = odm.CaseInsensitiveKeyword(description="The name of the analytic.")
66
66
  owner: Optional[str] = odm.Keyword(description="The username of the user who owns this analytic.", optional=True)
67
67
  contributors: list[str] = odm.List(
68
68
  odm.Keyword(),
@@ -71,7 +71,7 @@ class Analytic(odm.Model):
71
71
  )
72
72
  description: Optional[str] = odm.Text(description="A markdown description of the analytic", optional=True)
73
73
  detections: list[str] = odm.List(
74
- odm.Keyword(),
74
+ odm.CaseInsensitiveKeyword(),
75
75
  description="The detections which this analytic contains.",
76
76
  default=[],
77
77
  )
@@ -117,7 +117,7 @@ class Client(odm.Model):
117
117
  description="Collection of connected Internal Protocol routing prefixes",
118
118
  )
119
119
  )
120
- bytes: Optional[int] = odm.Optional(odm.Integer(description="Bytes sent from the client to the server."))
120
+ bytes: Optional[int] = odm.Optional(odm.Long(description="Bytes sent from the client to the server."))
121
121
  domain: Optional[str] = odm.Optional(odm.Keyword(description="The domain name of the client system."))
122
122
  geo: Geo = odm.Optional(
123
123
  odm.Compound(
@@ -161,10 +161,10 @@ class Log(odm.Model):
161
161
 
162
162
  @odm.model(index=True, store=True, description="Hit outline header.")
163
163
  class Header(odm.Model):
164
- threat: Optional[str] = odm.Optional(odm.Text(description="The IP of the threat."))
165
- target: Optional[str] = odm.Optional(odm.Text(description="The target of the hit."))
166
- indicators: list[str] = odm.List(odm.Text(description="Indicators of the hit."), default=[])
167
- summary: Optional[str] = odm.Optional(odm.Text(description="Summary of the hit."))
164
+ threat: Optional[str] = odm.Optional(odm.Keyword(description="The IP of the threat."))
165
+ target: Optional[str] = odm.Optional(odm.Keyword(description="The target of the hit."))
166
+ indicators: list[str] = odm.List(odm.Keyword(description="Indicators of the hit."), default=[])
167
+ summary: Optional[str] = odm.Optional(odm.Keyword(description="Summary of the hit."))
168
168
 
169
169
 
170
170
  @odm.model(index=True, store=True, description="Fields describing the location where this alert has been retained.")
@@ -176,15 +176,15 @@ class Incident(odm.Model):
176
176
 
177
177
  @odm.model(index=True, store=True, description="Labels for the hit")
178
178
  class Label(odm.Model):
179
- assignments = odm.List(odm.Text(description="List of assignments for the hit."), default=[])
180
- generic = odm.List(odm.Text(description="List of generic labels for the hit."), default=[])
181
- insight = odm.List(odm.Text(description="List of insight labels for the hit."), default=[])
182
- mitigation = odm.List(odm.Text(description="List of mitigation labels for the hit."), default=[])
183
- victim = odm.List(odm.Text(description="List of victim labels for the hit."), default=[])
184
- campaign = odm.List(odm.Text(description="List of campaign labels for the hit."), default=[])
185
- threat = odm.List(odm.Text(description="List of threat labels for the hit."), default=[])
186
- tuning = odm.List(odm.Text(description="List of tuning labels for the hit."), default=[])
187
- operation = odm.List(odm.Text(description="List of operation labels for the hit."), default=[])
179
+ assignments = odm.List(odm.Keyword(description="List of assignments for the hit."), default=[])
180
+ generic = odm.List(odm.Keyword(description="List of generic labels for the hit."), default=[])
181
+ insight = odm.List(odm.Keyword(description="List of insight labels for the hit."), default=[])
182
+ mitigation = odm.List(odm.Keyword(description="List of mitigation labels for the hit."), default=[])
183
+ victim = odm.List(odm.Keyword(description="List of victim labels for the hit."), default=[])
184
+ campaign = odm.List(odm.Keyword(description="List of campaign labels for the hit."), default=[])
185
+ threat = odm.List(odm.Keyword(description="List of threat labels for the hit."), default=[])
186
+ tuning = odm.List(odm.Keyword(description="List of tuning labels for the hit."), default=[])
187
+ operation = odm.List(odm.Keyword(description="List of operation labels for the hit."), default=[])
188
188
 
189
189
 
190
190
  @odm.model(index=True, store=True, description="Votes for the hit")
@@ -14,7 +14,7 @@ class Settings(odm.Model):
14
14
  @odm.model(index=True, store=True, description="Model of views")
15
15
  class View(odm.Model):
16
16
  view_id: str = odm.UUID(description="A UUID for this view")
17
- title: str = odm.Keyword(description="The name of this view.")
17
+ title: str = odm.CaseInsensitiveKeyword(description="The name of this view.")
18
18
  query: str = odm.Keyword(description="The query to run in this view.")
19
19
  sort: str = odm.Keyword(description="The sorting to use with this view.", optional=True)
20
20
  span: str = odm.Keyword(
@@ -32,6 +32,7 @@ from howler.odm import (
32
32
  Json,
33
33
  Keyword,
34
34
  List,
35
+ Long,
35
36
  LowerKeyword,
36
37
  Mapping,
37
38
  Model,
@@ -490,6 +491,8 @@ def random_data_for_field(field: _Field, name: str, minimal: bool = False) -> _A
490
491
  return get_random_iso_date()
491
492
  elif isinstance(field, Integer):
492
493
  return random.randint(128, 4096)
494
+ elif isinstance(field, Long):
495
+ return random.randint(1, 223372036854775807)
493
496
  elif isinstance(field, Float):
494
497
  return random.randint(12800, 409600) / 100.0
495
498
  elif isinstance(field, MD5):
@@ -20,7 +20,7 @@ def try_parse_date(date: str) -> Optional[datetime]:
20
20
  return None
21
21
 
22
22
 
23
- def try_parse_number(number: str | int | float) -> Optional[Union[int, float]]:
23
+ def try_parse_number(number: Union[str, int, float]) -> Optional[Union[int, float]]:
24
24
  "Try and parse a number string into an integer or float type, or infinity. Returns None if string is invalid."
25
25
  if isinstance(number, (int, float)):
26
26
  return number
@@ -148,7 +148,7 @@ suppress-none-returning = true
148
148
  [tool.poetry]
149
149
  package-mode = true
150
150
  name = "howler-api"
151
- version = "2.13.0.dev345"
151
+ version = "3.0.0.dev348"
152
152
  description = "Howler - API server"
153
153
  authors = [
154
154
  "Canadian Centre for Cyber Security <howler@cyber.gc.ca>",
@@ -1,46 +0,0 @@
1
- import sys
2
- import time
3
-
4
- DELAY = 5
5
-
6
- if __name__ == "__main__":
7
- print("This script will allow you to reindex all indexes in elasticsearch.")
8
- print("For obvious reasons, be EXTREMELY CAREFUL running this code.")
9
-
10
- for i in range(DELAY):
11
- print(f"Continuing in {str(DELAY - i)}...", end="\r")
12
- time.sleep(1)
13
- print()
14
- answer = input("Are you sure you want to reindex all data in this cluster? [yes/NO]\n")
15
-
16
- if not answer.startswith("y"):
17
- print("Confirmation not provided, stopping.")
18
- sys.exit(1)
19
-
20
- from howler.datastore.collection import ESCollection
21
-
22
- ESCollection.IGNORE_ENSURE_COLLECTION = True
23
-
24
- from howler.common import loader
25
-
26
- ds = loader.datastore(archive_access=False)
27
-
28
- print("You will be reindexing the following indexes:")
29
- print("\n".join(ds.hit.index_list_full))
30
-
31
- answer = input(("\nAre you sure you want to reindex all indexes? [yes/NO]\n"))
32
- print()
33
-
34
- if not answer.startswith("y"):
35
- print("Confirmation not provided, stopping.")
36
- sys.exit(1)
37
-
38
- for i in range(2 * DELAY):
39
- print(f"Reindexing in {2 * DELAY - i}...", end="\r")
40
- time.sleep(1)
41
-
42
- print()
43
-
44
- result = ds.hit.reindex()
45
-
46
- print(f"Reindex complete. Success: {result}.")