mentat-gulp 1.6.51__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 (366) hide show
  1. mentat_gulp-1.6.51/.devcontainer/Dockerfile +31 -0
  2. mentat_gulp-1.6.51/.devcontainer/devcontainer.json +60 -0
  3. mentat_gulp-1.6.51/.devcontainer/devsetup.sh +35 -0
  4. mentat_gulp-1.6.51/.devcontainer/docker-compose.yml +22 -0
  5. mentat_gulp-1.6.51/.env +23 -0
  6. mentat_gulp-1.6.51/.gitattributes +3 -0
  7. mentat_gulp-1.6.51/.github/ISSUE_TEMPLATE/bug_report.md +44 -0
  8. mentat_gulp-1.6.51/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  9. mentat_gulp-1.6.51/.github/copilot-instructions.md +31 -0
  10. mentat_gulp-1.6.51/.github/workflows/docker-ci.yml +61 -0
  11. mentat_gulp-1.6.51/.github/workflows/python-package.yml +75 -0
  12. mentat_gulp-1.6.51/.gitignore +51 -0
  13. mentat_gulp-1.6.51/CHANGELOG.md +84 -0
  14. mentat_gulp-1.6.51/CONTRIBUTING.md +82 -0
  15. mentat_gulp-1.6.51/DATASHEET.md +177 -0
  16. mentat_gulp-1.6.51/Dockerfile +74 -0
  17. mentat_gulp-1.6.51/Doxyfile +310 -0
  18. mentat_gulp-1.6.51/LICENSE.AGPL-3.0.txt +208 -0
  19. mentat_gulp-1.6.51/LICENSE.GULP.txt +54 -0
  20. mentat_gulp-1.6.51/LICENSE.md +4 -0
  21. mentat_gulp-1.6.51/MANIFEST.in +3 -0
  22. mentat_gulp-1.6.51/PKG-INFO +381 -0
  23. mentat_gulp-1.6.51/README.md +233 -0
  24. mentat_gulp-1.6.51/checkout_branch.sh +25 -0
  25. mentat_gulp-1.6.51/collab_migrate/1.5.1/migrate.py +369 -0
  26. mentat_gulp-1.6.51/collab_migrate/1.6.6/migrate.py +120 -0
  27. mentat_gulp-1.6.51/collab_migrate/example_migrate_collab.py +176 -0
  28. mentat_gulp-1.6.51/docker-compose.yml +224 -0
  29. mentat_gulp-1.6.51/docker-entrypoint.sh +17 -0
  30. mentat_gulp-1.6.51/docs/architecture.md +301 -0
  31. mentat_gulp-1.6.51/docs/install_dev.md +189 -0
  32. mentat_gulp-1.6.51/docs/install_docker.md +79 -0
  33. mentat_gulp-1.6.51/docs/integration.md +73 -0
  34. mentat_gulp-1.6.51/docs/observability.md +83 -0
  35. mentat_gulp-1.6.51/docs/plugins/ai_assistant.md +124 -0
  36. mentat_gulp-1.6.51/docs/plugins/bridge_manager.md +561 -0
  37. mentat_gulp-1.6.51/docs/plugins/csv.py.md +107 -0
  38. mentat_gulp-1.6.51/docs/plugins/enrich_abuse.md +44 -0
  39. mentat_gulp-1.6.51/docs/plugins/enrich_circl_hash.md +21 -0
  40. mentat_gulp-1.6.51/docs/plugins/json.py.md +98 -0
  41. mentat_gulp-1.6.51/docs/plugins/otel_receiver.md +115 -0
  42. mentat_gulp-1.6.51/docs/plugins/query_elasticsearch.md +121 -0
  43. mentat_gulp-1.6.51/docs/plugins/regex.py.md +92 -0
  44. mentat_gulp-1.6.51/docs/plugins/win_pe.py.md +96 -0
  45. mentat_gulp-1.6.51/docs/plugins/zip.py.md +99 -0
  46. mentat_gulp-1.6.51/docs/plugins_and_mapping.md +742 -0
  47. mentat_gulp-1.6.51/docs/query.md +62 -0
  48. mentat_gulp-1.6.51/docs/testing.md +105 -0
  49. mentat_gulp-1.6.51/docs/troubleshooting.md +237 -0
  50. mentat_gulp-1.6.51/gulp.code-workspace +29 -0
  51. mentat_gulp-1.6.51/logo.svg +106 -0
  52. mentat_gulp-1.6.51/prometheus.yml +12 -0
  53. mentat_gulp-1.6.51/pyproject.toml +185 -0
  54. mentat_gulp-1.6.51/reset_docker.sh +22 -0
  55. mentat_gulp-1.6.51/samples/apache_clf/access.log +1311 -0
  56. mentat_gulp-1.6.51/samples/apache_clf/error.log +1178 -0
  57. mentat_gulp-1.6.51/samples/chrome_history_sqlite_stacked/History +0 -0
  58. mentat_gulp-1.6.51/samples/chrome_webdata_sqlite_stacked/Web Data +0 -0
  59. mentat_gulp-1.6.51/samples/eml/sample.eml +64 -0
  60. mentat_gulp-1.6.51/samples/iis_access/iis.log +2 -0
  61. mentat_gulp-1.6.51/samples/iis_access_ncsa/iis_ncsa.log +4 -0
  62. mentat_gulp-1.6.51/samples/iis_access_w3c/iis_w3c.log +9 -0
  63. mentat_gulp-1.6.51/samples/json/generate_list.py +91 -0
  64. mentat_gulp-1.6.51/samples/json/jsondict.json +11 -0
  65. mentat_gulp-1.6.51/samples/json/jsonline.json +5 -0
  66. mentat_gulp-1.6.51/samples/json/jsonlist.json +7 -0
  67. mentat_gulp-1.6.51/samples/json/test_list.json +1 -0
  68. mentat_gulp-1.6.51/samples/lin_syslog/auth.log +70 -0
  69. mentat_gulp-1.6.51/samples/lin_syslog/syslog +2548 -0
  70. mentat_gulp-1.6.51/samples/mbox/sample.mbox +685 -0
  71. mentat_gulp-1.6.51/samples/memprocfs/ntfs_files.txt +34 -0
  72. mentat_gulp-1.6.51/samples/memprocfs/timeline_all.txt +77140 -0
  73. mentat_gulp-1.6.51/samples/memprocfs/timeline_little.txt +3 -0
  74. mentat_gulp-1.6.51/samples/memprocfs/web.txt +31 -0
  75. mentat_gulp-1.6.51/samples/mftecmd/sample_j.csv +76 -0
  76. mentat_gulp-1.6.51/samples/mftecmd/sample_record.csv +11 -0
  77. mentat_gulp-1.6.51/samples/mysql_error/mysql_error.log +63 -0
  78. mentat_gulp-1.6.51/samples/mysql_general/example.general.log +4056 -0
  79. mentat_gulp-1.6.51/samples/pcap/220614_ip_flags_google.pcapng +0 -0
  80. mentat_gulp-1.6.51/samples/pfsense/filter.log +61 -0
  81. mentat_gulp-1.6.51/samples/sqlite/chrome_history +0 -0
  82. mentat_gulp-1.6.51/samples/sqlite/chrome_webdata +0 -0
  83. mentat_gulp-1.6.51/samples/suricata/eve.json +285 -0
  84. mentat_gulp-1.6.51/samples/suricata/eve_long.json +7775 -0
  85. mentat_gulp-1.6.51/samples/suricata/fast.log +9 -0
  86. mentat_gulp-1.6.51/samples/systemd_journal/system.journal +0 -0
  87. mentat_gulp-1.6.51/samples/teamviewer/connections_incoming.txt +2 -0
  88. mentat_gulp-1.6.51/samples/win_evtx/2-system-Microsoft-Windows-LiveId%4Operational.evtx +0 -0
  89. mentat_gulp-1.6.51/samples/win_evtx/2-system-Security-dirty.evtx +0 -0
  90. mentat_gulp-1.6.51/samples/win_evtx/2-vss_0-Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx +0 -0
  91. mentat_gulp-1.6.51/samples/win_evtx/2-vss_0-Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx +0 -0
  92. mentat_gulp-1.6.51/samples/win_evtx/2-vss_7-System.evtx +0 -0
  93. mentat_gulp-1.6.51/samples/win_evtx/Application.evtx +0 -0
  94. mentat_gulp-1.6.51/samples/win_evtx/Application_no_crc32.evtx +0 -0
  95. mentat_gulp-1.6.51/samples/win_evtx/Archive-ForwardedEvents-test.evtx +0 -0
  96. mentat_gulp-1.6.51/samples/win_evtx/E_ShadowCopy6_windows_system32_winevt_logs_Microsoft-Windows-CAPI2%4Operational.evtx +0 -0
  97. mentat_gulp-1.6.51/samples/win_evtx/E_Windows_system32_winevt_logs_Microsoft-Windows-CAPI2%4Operational.evtx +0 -0
  98. mentat_gulp-1.6.51/samples/win_evtx/E_Windows_system32_winevt_logs_Microsoft-Windows-Shell-Core%4Operational.evtx +0 -0
  99. mentat_gulp-1.6.51/samples/win_evtx/MSExchange_Management_wec.evtx +0 -0
  100. mentat_gulp-1.6.51/samples/win_evtx/Microsoft-Windows-HelloForBusiness%4Operational.evtx +0 -0
  101. mentat_gulp-1.6.51/samples/win_evtx/Microsoft-Windows-LanguagePackSetup%4Operational.evtx +0 -0
  102. mentat_gulp-1.6.51/samples/win_evtx/Security_short_selected.evtx +0 -0
  103. mentat_gulp-1.6.51/samples/win_evtx/issue_201.evtx +0 -0
  104. mentat_gulp-1.6.51/samples/win_evtx/new-user-security.evtx +0 -0
  105. mentat_gulp-1.6.51/samples/win_evtx/post-Security.evtx +0 -0
  106. mentat_gulp-1.6.51/samples/win_evtx/sample-with-irregular-bool-values.evtx +0 -0
  107. mentat_gulp-1.6.51/samples/win_evtx/sample_with_a_bad_chunk_magic.evtx +0 -0
  108. mentat_gulp-1.6.51/samples/win_evtx/security.evtx +0 -0
  109. mentat_gulp-1.6.51/samples/win_evtx/security_big_sample.evtx +0 -0
  110. mentat_gulp-1.6.51/samples/win_evtx/sysmon.evtx +0 -0
  111. mentat_gulp-1.6.51/samples/win_evtx/system.evtx +0 -0
  112. mentat_gulp-1.6.51/samples/win_reg/NTUSER.DAT +0 -0
  113. mentat_gulp-1.6.51/samples/zeek/conn.log +34 -0
  114. mentat_gulp-1.6.51/samples/zeek/dce_rpc.log +3 -0
  115. mentat_gulp-1.6.51/samples/zeek/dhcp.log +4 -0
  116. mentat_gulp-1.6.51/samples/zeek/dns.log +4 -0
  117. mentat_gulp-1.6.51/samples/zeek/files.log +11 -0
  118. mentat_gulp-1.6.51/samples/zeek/ftp.log +4 -0
  119. mentat_gulp-1.6.51/samples/zeek/http.log +5 -0
  120. mentat_gulp-1.6.51/samples/zeek/irc.log +11 -0
  121. mentat_gulp-1.6.51/samples/zeek/kerberos.log +5 -0
  122. mentat_gulp-1.6.51/samples/zeek/known_certs.log +1 -0
  123. mentat_gulp-1.6.51/samples/zeek/known_hosts.log +5 -0
  124. mentat_gulp-1.6.51/samples/zeek/known_services.log +20 -0
  125. mentat_gulp-1.6.51/samples/zeek/ldap.log +2 -0
  126. mentat_gulp-1.6.51/samples/zeek/ldap_search.log +1 -0
  127. mentat_gulp-1.6.51/samples/zeek/notice.log +6 -0
  128. mentat_gulp-1.6.51/samples/zeek/ntlm.log +7 -0
  129. mentat_gulp-1.6.51/samples/zeek/ntp.log +2 -0
  130. mentat_gulp-1.6.51/samples/zeek/packet_filter.log +0 -0
  131. mentat_gulp-1.6.51/samples/zeek/pe.log +4 -0
  132. mentat_gulp-1.6.51/samples/zeek/postgresql.log +3 -0
  133. mentat_gulp-1.6.51/samples/zeek/quic.log +1 -0
  134. mentat_gulp-1.6.51/samples/zeek/rdp.log +1 -0
  135. mentat_gulp-1.6.51/samples/zeek/smb_files.log +7 -0
  136. mentat_gulp-1.6.51/samples/zeek/smb_mapping.log +5 -0
  137. mentat_gulp-1.6.51/samples/zeek/smtp.log +2 -0
  138. mentat_gulp-1.6.51/samples/zeek/software.log +4 -0
  139. mentat_gulp-1.6.51/samples/zeek/ssh.log +5 -0
  140. mentat_gulp-1.6.51/samples/zeek/ssl.log +13 -0
  141. mentat_gulp-1.6.51/samples/zeek/traceroute.log +4 -0
  142. mentat_gulp-1.6.51/samples/zeek/tunnel.log +8 -0
  143. mentat_gulp-1.6.51/samples/zeek/weird.log +2 -0
  144. mentat_gulp-1.6.51/samples/zeek/x509.log +7 -0
  145. mentat_gulp-1.6.51/screenshot-1.png +0 -0
  146. mentat_gulp-1.6.51/screenshot-2.png +0 -0
  147. mentat_gulp-1.6.51/screenshot-3.png +0 -0
  148. mentat_gulp-1.6.51/setup.cfg +4 -0
  149. mentat_gulp-1.6.51/src/gulp/__init__.py +14 -0
  150. mentat_gulp-1.6.51/src/gulp/__main__.py +226 -0
  151. mentat_gulp-1.6.51/src/gulp/_version.py +24 -0
  152. mentat_gulp-1.6.51/src/gulp/api/collab/__init__.py +0 -0
  153. mentat_gulp-1.6.51/src/gulp/api/collab/assets/__init__.py +0 -0
  154. mentat_gulp-1.6.51/src/gulp/api/collab/assets/icons.txt +1900 -0
  155. mentat_gulp-1.6.51/src/gulp/api/collab/context.py +222 -0
  156. mentat_gulp-1.6.51/src/gulp/api/collab/enhance_doc_map.py +29 -0
  157. mentat_gulp-1.6.51/src/gulp/api/collab/field_types_entry.py +99 -0
  158. mentat_gulp-1.6.51/src/gulp/api/collab/glyph.py +57 -0
  159. mentat_gulp-1.6.51/src/gulp/api/collab/highlight.py +139 -0
  160. mentat_gulp-1.6.51/src/gulp/api/collab/link.py +40 -0
  161. mentat_gulp-1.6.51/src/gulp/api/collab/mapping_parameters.py +81 -0
  162. mentat_gulp-1.6.51/src/gulp/api/collab/note.py +352 -0
  163. mentat_gulp-1.6.51/src/gulp/api/collab/operation.py +320 -0
  164. mentat_gulp-1.6.51/src/gulp/api/collab/source.py +116 -0
  165. mentat_gulp-1.6.51/src/gulp/api/collab/source_field_types.py +177 -0
  166. mentat_gulp-1.6.51/src/gulp/api/collab/stats.py +784 -0
  167. mentat_gulp-1.6.51/src/gulp/api/collab/structs.py +2118 -0
  168. mentat_gulp-1.6.51/src/gulp/api/collab/user.py +590 -0
  169. mentat_gulp-1.6.51/src/gulp/api/collab/user_group.py +197 -0
  170. mentat_gulp-1.6.51/src/gulp/api/collab/user_session.py +307 -0
  171. mentat_gulp-1.6.51/src/gulp/api/collab_api.py +636 -0
  172. mentat_gulp-1.6.51/src/gulp/api/mapping/__init__.py +0 -0
  173. mentat_gulp-1.6.51/src/gulp/api/mapping/index_template/__init__.py +0 -0
  174. mentat_gulp-1.6.51/src/gulp/api/mapping/index_template/template.json +7793 -0
  175. mentat_gulp-1.6.51/src/gulp/api/mapping/models.py +326 -0
  176. mentat_gulp-1.6.51/src/gulp/api/mapping/templates/__init__.py +0 -0
  177. mentat_gulp-1.6.51/src/gulp/api/mapping/templates/ecs_template.json +7793 -0
  178. mentat_gulp-1.6.51/src/gulp/api/opensearch/__init__.py +0 -0
  179. mentat_gulp-1.6.51/src/gulp/api/opensearch/filters.py +392 -0
  180. mentat_gulp-1.6.51/src/gulp/api/opensearch/sigma.py +832 -0
  181. mentat_gulp-1.6.51/src/gulp/api/opensearch/structs.py +808 -0
  182. mentat_gulp-1.6.51/src/gulp/api/opensearch_api.py +2333 -0
  183. mentat_gulp-1.6.51/src/gulp/api/prometheus_api.py +495 -0
  184. mentat_gulp-1.6.51/src/gulp/api/redis_api.py +1405 -0
  185. mentat_gulp-1.6.51/src/gulp/api/s3_api.py +719 -0
  186. mentat_gulp-1.6.51/src/gulp/api/server/__init__.py +0 -0
  187. mentat_gulp-1.6.51/src/gulp/api/server/db.py +618 -0
  188. mentat_gulp-1.6.51/src/gulp/api/server/enrich.py +979 -0
  189. mentat_gulp-1.6.51/src/gulp/api/server/glyph.py +296 -0
  190. mentat_gulp-1.6.51/src/gulp/api/server/highlight.py +333 -0
  191. mentat_gulp-1.6.51/src/gulp/api/server/ingest.py +1662 -0
  192. mentat_gulp-1.6.51/src/gulp/api/server/link.py +327 -0
  193. mentat_gulp-1.6.51/src/gulp/api/server/note.py +389 -0
  194. mentat_gulp-1.6.51/src/gulp/api/server/object_acl.py +414 -0
  195. mentat_gulp-1.6.51/src/gulp/api/server/operation.py +1104 -0
  196. mentat_gulp-1.6.51/src/gulp/api/server/query.py +2132 -0
  197. mentat_gulp-1.6.51/src/gulp/api/server/server_utils.py +364 -0
  198. mentat_gulp-1.6.51/src/gulp/api/server/storage.py +289 -0
  199. mentat_gulp-1.6.51/src/gulp/api/server/structs.py +638 -0
  200. mentat_gulp-1.6.51/src/gulp/api/server/user.py +1107 -0
  201. mentat_gulp-1.6.51/src/gulp/api/server/user_group.py +440 -0
  202. mentat_gulp-1.6.51/src/gulp/api/server/utility.py +1406 -0
  203. mentat_gulp-1.6.51/src/gulp/api/server/ws.py +918 -0
  204. mentat_gulp-1.6.51/src/gulp/api/server_api.py +885 -0
  205. mentat_gulp-1.6.51/src/gulp/api/ws_api.py +2348 -0
  206. mentat_gulp-1.6.51/src/gulp/config.py +1284 -0
  207. mentat_gulp-1.6.51/src/gulp/gulp.py +8 -0
  208. mentat_gulp-1.6.51/src/gulp/gulp_cfg_template.json +161 -0
  209. mentat_gulp-1.6.51/src/gulp/mapping_files/__init__.py +0 -0
  210. mentat_gulp-1.6.51/src/gulp/mapping_files/apache_access_clf.json +49 -0
  211. mentat_gulp-1.6.51/src/gulp/mapping_files/apache_error_clf.json +31 -0
  212. mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_usbdevices.json +30 -0
  213. mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_webform_autofill.json +27 -0
  214. mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_webhistory.json +36 -0
  215. mentat_gulp-1.6.51/src/gulp/mapping_files/chrome_history.json +94 -0
  216. mentat_gulp-1.6.51/src/gulp/mapping_files/chrome_webdata.json +29 -0
  217. mentat_gulp-1.6.51/src/gulp/mapping_files/firefox_sqlite.json +24 -0
  218. mentat_gulp-1.6.51/src/gulp/mapping_files/hayabusa_csv.json +62 -0
  219. mentat_gulp-1.6.51/src/gulp/mapping_files/jlecmd_csv.json +108 -0
  220. mentat_gulp-1.6.51/src/gulp/mapping_files/lecmd_csv.json +49 -0
  221. mentat_gulp-1.6.51/src/gulp/mapping_files/lin_syslog.json +24 -0
  222. mentat_gulp-1.6.51/src/gulp/mapping_files/mem_proc_fs.json +51 -0
  223. mentat_gulp-1.6.51/src/gulp/mapping_files/mftecmd_csv.json +137 -0
  224. mentat_gulp-1.6.51/src/gulp/mapping_files/otel.json +1020 -0
  225. mentat_gulp-1.6.51/src/gulp/mapping_files/pcap.json +134 -0
  226. mentat_gulp-1.6.51/src/gulp/mapping_files/pecmd_csv.json +78 -0
  227. mentat_gulp-1.6.51/src/gulp/mapping_files/plaso_csv.json +91 -0
  228. mentat_gulp-1.6.51/src/gulp/mapping_files/recent_file_cache_parser_csv.json +27 -0
  229. mentat_gulp-1.6.51/src/gulp/mapping_files/srumecmd.json +110 -0
  230. mentat_gulp-1.6.51/src/gulp/mapping_files/suricata.json +463 -0
  231. mentat_gulp-1.6.51/src/gulp/mapping_files/systemd_journal.json +37 -0
  232. mentat_gulp-1.6.51/src/gulp/mapping_files/volatility_csv.json +223 -0
  233. mentat_gulp-1.6.51/src/gulp/mapping_files/wazuh.json +375 -0
  234. mentat_gulp-1.6.51/src/gulp/mapping_files/windows.json +775 -0
  235. mentat_gulp-1.6.51/src/gulp/mapping_files/zeek.json +1950 -0
  236. mentat_gulp-1.6.51/src/gulp/plugin.py +4033 -0
  237. mentat_gulp-1.6.51/src/gulp/plugins/__init__.py +1 -0
  238. mentat_gulp-1.6.51/src/gulp/plugins/apache_access_clf.py +198 -0
  239. mentat_gulp-1.6.51/src/gulp/plugins/apache_error_clf.py +158 -0
  240. mentat_gulp-1.6.51/src/gulp/plugins/chrome_history_sqlite_stacked.py +160 -0
  241. mentat_gulp-1.6.51/src/gulp/plugins/chrome_webdata_sqlite_stacked.py +161 -0
  242. mentat_gulp-1.6.51/src/gulp/plugins/csv.py +173 -0
  243. mentat_gulp-1.6.51/src/gulp/plugins/eml.py +192 -0
  244. mentat_gulp-1.6.51/src/gulp/plugins/enrich_abuse.py +326 -0
  245. mentat_gulp-1.6.51/src/gulp/plugins/enrich_circl_hash.py +256 -0
  246. mentat_gulp-1.6.51/src/gulp/plugins/enrich_example.py +116 -0
  247. mentat_gulp-1.6.51/src/gulp/plugins/enrich_whois.py +827 -0
  248. mentat_gulp-1.6.51/src/gulp/plugins/extension/__init__.py +1 -0
  249. mentat_gulp-1.6.51/src/gulp/plugins/extension/ai_assistant.py +376 -0
  250. mentat_gulp-1.6.51/src/gulp/plugins/extension/bridge_manager.py +862 -0
  251. mentat_gulp-1.6.51/src/gulp/plugins/extension/example_chunk_callbacks.py +69 -0
  252. mentat_gulp-1.6.51/src/gulp/plugins/extension/example_extension.py +203 -0
  253. mentat_gulp-1.6.51/src/gulp/plugins/extension/otel_receiver.py +836 -0
  254. mentat_gulp-1.6.51/src/gulp/plugins/iis_access.py +155 -0
  255. mentat_gulp-1.6.51/src/gulp/plugins/iis_access_ncsa.py +140 -0
  256. mentat_gulp-1.6.51/src/gulp/plugins/iis_access_w3c.py +139 -0
  257. mentat_gulp-1.6.51/src/gulp/plugins/json.py +284 -0
  258. mentat_gulp-1.6.51/src/gulp/plugins/lin_syslog.py +150 -0
  259. mentat_gulp-1.6.51/src/gulp/plugins/mbox.py +123 -0
  260. mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs.py +162 -0
  261. mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs_ntfs.py +173 -0
  262. mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs_web.py +146 -0
  263. mentat_gulp-1.6.51/src/gulp/plugins/mysql_error.py +145 -0
  264. mentat_gulp-1.6.51/src/gulp/plugins/mysql_general.py +304 -0
  265. mentat_gulp-1.6.51/src/gulp/plugins/pcap.py +370 -0
  266. mentat_gulp-1.6.51/src/gulp/plugins/pfsense.py +288 -0
  267. mentat_gulp-1.6.51/src/gulp/plugins/query_elasticsearch.py +576 -0
  268. mentat_gulp-1.6.51/src/gulp/plugins/raw.py +147 -0
  269. mentat_gulp-1.6.51/src/gulp/plugins/regex.py +185 -0
  270. mentat_gulp-1.6.51/src/gulp/plugins/sqlite.py +284 -0
  271. mentat_gulp-1.6.51/src/gulp/plugins/stacked_example.py +97 -0
  272. mentat_gulp-1.6.51/src/gulp/plugins/stacked_on_stacked_example.py +93 -0
  273. mentat_gulp-1.6.51/src/gulp/plugins/suricata_fast_log.py +156 -0
  274. mentat_gulp-1.6.51/src/gulp/plugins/systemd_journal.py +153 -0
  275. mentat_gulp-1.6.51/src/gulp/plugins/teamviewer_regex_stacked.py +131 -0
  276. mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_plugin.tsx +1 -0
  277. mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_plugin.tsx.json +7 -0
  278. mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_send_data_plugin.tsx +89 -0
  279. mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_send_data_plugin.tsx.json +12 -0
  280. mentat_gulp-1.6.51/src/gulp/plugins/win_evtx.py +236 -0
  281. mentat_gulp-1.6.51/src/gulp/plugins/win_pe.py +211 -0
  282. mentat_gulp-1.6.51/src/gulp/plugins/win_reg.py +190 -0
  283. mentat_gulp-1.6.51/src/gulp/plugins/zip.py +220 -0
  284. mentat_gulp-1.6.51/src/gulp/process.py +402 -0
  285. mentat_gulp-1.6.51/src/gulp/structs.py +440 -0
  286. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/PKG-INFO +381 -0
  287. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/SOURCES.txt +364 -0
  288. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/dependency_links.txt +1 -0
  289. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/entry_points.txt +2 -0
  290. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/requires.txt +139 -0
  291. mentat_gulp-1.6.51/src/mentat_gulp.egg-info/top_level.txt +1 -0
  292. mentat_gulp-1.6.51/test_scripts/__init__.py +0 -0
  293. mentat_gulp-1.6.51/test_scripts/count_data_chunk.py +14 -0
  294. mentat_gulp-1.6.51/test_scripts/count_json.py +11 -0
  295. mentat_gulp-1.6.51/test_scripts/count_lines.py +57 -0
  296. mentat_gulp-1.6.51/test_scripts/count_strings.py +37 -0
  297. mentat_gulp-1.6.51/test_scripts/create_mutated_raw.py +320 -0
  298. mentat_gulp-1.6.51/test_scripts/evtx_count.py +51 -0
  299. mentat_gulp-1.6.51/test_scripts/ingest.py +371 -0
  300. mentat_gulp-1.6.51/test_scripts/ingest_raw.py +147 -0
  301. mentat_gulp-1.6.51/test_scripts/log_into_devcontainer.sh +3 -0
  302. mentat_gulp-1.6.51/test_scripts/query_external.py +211 -0
  303. mentat_gulp-1.6.51/test_scripts/run_tests.sh +45 -0
  304. mentat_gulp-1.6.51/tests/__init__.py +3 -0
  305. mentat_gulp-1.6.51/tests/conftest.py +65 -0
  306. mentat_gulp-1.6.51/tests/e2e/test_workflows.py +82 -0
  307. mentat_gulp-1.6.51/tests/integration/test_acl.py +197 -0
  308. mentat_gulp-1.6.51/tests/integration/test_auth.py +76 -0
  309. mentat_gulp-1.6.51/tests/integration/test_collab.py +369 -0
  310. mentat_gulp-1.6.51/tests/integration/test_db.py +148 -0
  311. mentat_gulp-1.6.51/tests/integration/test_enrich.py +267 -0
  312. mentat_gulp-1.6.51/tests/integration/test_ingest_win_evtx.py +373 -0
  313. mentat_gulp-1.6.51/tests/integration/test_operations.py +467 -0
  314. mentat_gulp-1.6.51/tests/integration/test_plugins.py +478 -0
  315. mentat_gulp-1.6.51/tests/integration/test_queries.py +401 -0
  316. mentat_gulp-1.6.51/tests/integration/test_storage.py +188 -0
  317. mentat_gulp-1.6.51/tests/integration/test_stress.py +735 -0
  318. mentat_gulp-1.6.51/tests/integration/test_users.py +223 -0
  319. mentat_gulp-1.6.51/tests/integration/test_ws_collab_notifications.py +233 -0
  320. mentat_gulp-1.6.51/tests/integration/test_ws_notifications_wait.py +150 -0
  321. mentat_gulp-1.6.51/tests/integration/test_ws_user_notifications.py +89 -0
  322. mentat_gulp-1.6.51/tests/sigma_match_all.yml +14 -0
  323. mentat_gulp-1.6.51/tests/sigma_windows.zip +0 -0
  324. mentat_gulp-1.6.51/tests/sigma_windows_small.zip +0 -0
  325. mentat_gulp-1.6.51/tests/test_ingest_zip.zip +0 -0
  326. mentat_gulp-1.6.51/tests/unit/test_multi_instance_routing.py +732 -0
  327. mentat_gulp-1.6.51/tests/unit/test_ws_api.py +178 -0
  328. mentat_gulp-1.6.51/tests_old/README.md +6 -0
  329. mentat_gulp-1.6.51/tests_old/__init__.py +0 -0
  330. mentat_gulp-1.6.51/tests_old/enrich/test_enrich_abuse.py +234 -0
  331. mentat_gulp-1.6.51/tests_old/enrich/test_enrich_circl_hash.py +207 -0
  332. mentat_gulp-1.6.51/tests_old/enrich/test_enrich_whois.py +276 -0
  333. mentat_gulp-1.6.51/tests_old/extension/__init__.py +0 -0
  334. mentat_gulp-1.6.51/tests_old/extension/test_ai_assistant.py +146 -0
  335. mentat_gulp-1.6.51/tests_old/ingest/__init__.py +0 -0
  336. mentat_gulp-1.6.51/tests_old/ingest/raw_chunk.json +38 -0
  337. mentat_gulp-1.6.51/tests_old/ingest/test_ingest.py +1245 -0
  338. mentat_gulp-1.6.51/tests_old/ingest/test_ingest_zip.zip +0 -0
  339. mentat_gulp-1.6.51/tests_old/query/__init__.py +0 -0
  340. mentat_gulp-1.6.51/tests_old/query/sigma/Microsoft-Windows-Sysmon%4Operational.evtx +0 -0
  341. mentat_gulp-1.6.51/tests_old/query/sigma/Microsoft-Windows-Windows Defender%4Operational.evtx +0 -0
  342. mentat_gulp-1.6.51/tests_old/query/sigma/match_all.yaml +14 -0
  343. mentat_gulp-1.6.51/tests_old/query/sigma/match_some.yaml +19 -0
  344. mentat_gulp-1.6.51/tests_old/query/sigma/match_some_more.yaml +18 -0
  345. mentat_gulp-1.6.51/tests_old/query/sigma/win_defender_threat.yml +25 -0
  346. mentat_gulp-1.6.51/tests_old/query/sigma/windefend_test.yml +46 -0
  347. mentat_gulp-1.6.51/tests_old/query/sigma/windows.zip +0 -0
  348. mentat_gulp-1.6.51/tests_old/query/sigma/windows_small.zip +0 -0
  349. mentat_gulp-1.6.51/tests_old/query/test_query_api.py +429 -0
  350. mentat_gulp-1.6.51/tests_old/query/test_query_external_elasticsearch.py +113 -0
  351. mentat_gulp-1.6.51/tests_old/query/test_query_external_wazuh.py +130 -0
  352. mentat_gulp-1.6.51/tests_old/smoke_test.sh +104 -0
  353. mentat_gulp-1.6.51/tests_old/test_db.py +185 -0
  354. mentat_gulp-1.6.51/tests_old/test_glyph.py +104 -0
  355. mentat_gulp-1.6.51/tests_old/test_highlight.py +102 -0
  356. mentat_gulp-1.6.51/tests_old/test_link.py +115 -0
  357. mentat_gulp-1.6.51/tests_old/test_note.py +363 -0
  358. mentat_gulp-1.6.51/tests_old/test_operation.py +478 -0
  359. mentat_gulp-1.6.51/tests_old/test_storage.py +64 -0
  360. mentat_gulp-1.6.51/tests_old/test_tag_documents.py +159 -0
  361. mentat_gulp-1.6.51/tests_old/test_user.py +348 -0
  362. mentat_gulp-1.6.51/tests_old/test_user_group.py +143 -0
  363. mentat_gulp-1.6.51/tests_old/test_utility.py +142 -0
  364. mentat_gulp-1.6.51/tests_old/test_ws_client_data.py +120 -0
  365. mentat_gulp-1.6.51/tests_old/user.png +0 -0
  366. mentat_gulp-1.6.51/update_requirements_txt.sh +10 -0
@@ -0,0 +1,31 @@
1
+ # .devcontainer/Dockerfile
2
+ FROM mcr.microsoft.com/vscode/devcontainers/python:3.13-bullseye
3
+
4
+ # Install OS dependencies
5
+ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarn-keyring.gpg && \
6
+ echo "deb [signed-by=/usr/share/keyrings/yarn-keyring.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list > /dev/null && \
7
+ apt update && export DEBIAN_FRONTEND=noninteractive && \
8
+ apt -y install --no-install-recommends \
9
+ rustc \
10
+ libsystemd-dev \
11
+ jq \
12
+ inetutils-ping \
13
+ libpqxx-dev \
14
+ git-lfs \
15
+ rsyslog
16
+
17
+ # Install pipx
18
+ RUN python3 -m pip install --user pipx && \
19
+ python3 -m pipx ensurepath
20
+
21
+ # setup docker
22
+ RUN curl -fsSL https://get.docker.com | sh && \
23
+ apt -y install --no-install-recommends docker-compose && \
24
+ # Create docker group if it doesn't exist
25
+ groupadd -f docker && \
26
+ usermod -aG docker vscode && \
27
+ mkdir -p /run/docker
28
+
29
+ # Clean up
30
+ RUN apt-get clean && rm -rf /var/lib/apt/lists/*
31
+
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "Gulp Dev Container",
3
+ "dockerComposeFile": "docker-compose.yml",
4
+ "service": "dev",
5
+ "workspaceFolder": "/gulp",
6
+ "customizations": {
7
+ "vscode": {
8
+ "extensions": [
9
+ "bierner.markdown-mermaid",
10
+ "codezombiech.gitignore",
11
+ "DavidAnson.vscode-markdownlint",
12
+ "dracula-theme.theme-dracula",
13
+ "eliostruyf.vscode-hide-comments",
14
+ "foxundermoon.shell-format",
15
+ "fuadpashayev.bottom-terminal",
16
+ "Gerrnperl.outline-map",
17
+ "github.copilot-chat",
18
+ "github.vscode-github-actions",
19
+ "GitHub.vscode-pull-request-github",
20
+ "Gruntfuggly.todo-tree",
21
+ "kevinkyang.auto-comment-blocks",
22
+ "ms-python.black-formatter",
23
+ "ms-python.isort",
24
+ "ms-python.python",
25
+ "ms-vscode.cpptools-extension-pack",
26
+ "oderwat.indent-rainbow",
27
+ "tamasfe.even-better-toml",
28
+ "Tyriar.sort-lines",
29
+ "yzhang.markdown-all-in-one",
30
+ "zh9528.file-size"
31
+ ]
32
+ }
33
+ },
34
+ "features": {
35
+ "ghcr.io/meaningful-ooo/devcontainer-features/fish:1": {},
36
+ "ghcr.io/jungaretti/features/vim:1": {}
37
+ },
38
+ "remoteUser": "vscode",
39
+ "init": true,
40
+ "privileged": true,
41
+ "mounts": [
42
+ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind,consistency=cached",
43
+ // make these accessible in the container for development (must be cloned in the parent folder of this repo)
44
+ "source=${localWorkspaceFolder}/../gulp-paid-plugins,target=${containerWorkspaceFolder}/gulp-paid-plugins,type=bind,consistency=cached",
45
+ "source=${localWorkspaceFolder}/../muty-python,target=${containerWorkspaceFolder}/muty-python,type=bind,consistency=cached",
46
+ "source=${localWorkspaceFolder}/../gulp-sdk,target=${containerWorkspaceFolder}/gulp-sdk,type=bind,consistency=cached",
47
+ "source=${localWorkspaceFolder}/../gulp-cli,target=${containerWorkspaceFolder}/gulp-cli,type=bind,consistency=cached",
48
+ "source=${localWorkspaceFolder}/../gulpui-web,target=${containerWorkspaceFolder}/gulpui-web,type=bind,consistency=cached",
49
+ // map the config for development (references the gulp-paid-plugins above for the extra plugins and mapping files)
50
+ "source=${localEnv:HOME}/.config/gulp,target=/home/vscode/.config/gulp,type=bind,consistency=cached",
51
+ "source=${localWorkspaceFolder}/../gulp-paid-plugins/src/gulp-paid-plugins/plugins,target=/home/vscode/.config/gulp/plugins,type=bind,consistency=cached",
52
+ "source=${localWorkspaceFolder}/../gulp-paid-plugins/src/gulp-paid-plugins/mapping_files,target=/home/vscode/.config/gulp/mapping_files,type=bind,consistency=cached",
53
+ "source=${localEnv:HOME}/.config/fish,target=/home/vscode/.config/fish,type=bind,consistency=cached"
54
+ ],
55
+ "remoteEnv": {
56
+ "PATH": "${containerEnv:PATH}:/home/vscode/.local/bin"
57
+ },
58
+ "postCreateCommand": "chmod +x .devcontainer/devsetup.sh && .devcontainer/devsetup.sh",
59
+ "postStartCommand": "sudo mkdir -p /run/rsyslog && (pgrep -x rsyslogd >/dev/null || sudo rsyslogd)"
60
+ }
@@ -0,0 +1,35 @@
1
+ #!/bin/bash
2
+
3
+ # set up permissions for docker socket
4
+ echo "[.] Setting up docker permissions"
5
+ sudo chmod 666 /var/run/docker.sock
6
+
7
+ # set permission for pip cache
8
+ sudo mkdir -p /home/vscode/.cache/pip && sudo chown -R vscode:vscode /home/vscode/.cache
9
+
10
+ python3 -m venv ./.venv
11
+ source ./.venv/bin/activate
12
+
13
+ # install development packages
14
+ echo "[.] Installing gulp"
15
+ pip3 install --timeout=1000 -e .
16
+ if [ $? -ne 0 ]; then
17
+ echo "[-] Failed to install gulp"
18
+ exit 1
19
+ fi
20
+
21
+ echo "[.] Installing muty-ptyhon"
22
+ pip3 install --timeout=1000 -e ./muty-python
23
+ if [ $? -ne 0 ]; then
24
+ echo "[-] Failed to install muty-python"
25
+ exit 1
26
+ fi
27
+
28
+ echo "[.] Installing gulp sdk (for tests, bridges, ...)"
29
+ pip3 install --timeout=1000 -e ./gulp-sdk
30
+ if [ $? -ne 0 ]; then
31
+ echo "[-] Failed to install gulp-sdk for python"
32
+ exit 1
33
+ fi
34
+
35
+ echo "[.] development environment setup complete"
@@ -0,0 +1,22 @@
1
+ services:
2
+ dev:
3
+ build: .
4
+ volumes:
5
+ - ..:/gulp:cached
6
+ - /var/run/docker.sock:/var/run/docker.sock
7
+ # use a named volume for pip cache to persist it across container rebuilds
8
+ - pip-cache:/home/vscode/.cache/pip
9
+ command: sleep infinity
10
+ ports:
11
+ # gulp
12
+ - "8080:8080"
13
+ privileged: true
14
+ group_add:
15
+ - docker
16
+
17
+ network_mode: "host"
18
+ init: true
19
+
20
+ volumes:
21
+ pip-cache:
22
+ driver: local
@@ -0,0 +1,23 @@
1
+ # python
2
+ PYTHON_VERSION=3.13
3
+
4
+ # postgres
5
+ POSTGRES_DB=gulp
6
+ POSTGRES_USER=postgres
7
+ POSTGRES_PASSWORD=Gulp1234!
8
+ POSTGRES_MAX_CONNECTIONS=500
9
+
10
+ # opensearch
11
+ OPENSEARCH_USER=admin
12
+ OPENSEARCH_PASSWORD=Gulp1234!
13
+
14
+ # redis
15
+ REDIS_PASSWORD=Gulp1234!
16
+
17
+ # sftpd
18
+ SFTPD_USER=gulp
19
+ SFTPD_PASSWORD=Gulp1234!
20
+
21
+ # minio
22
+ MINIO_USER=admin
23
+ MINIO_PASSWORD=Gulp1234!
@@ -0,0 +1,3 @@
1
+ samples/mftecmd filter=lfs diff=lfs merge=lfs -text
2
+ samples/win_evtx filter=lfs diff=lfs merge=lfs -text
3
+ test_scripts/test_upload_with_metadata_json.zip filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+
12
+ A clear and concise description of what the bug is, including **a significant output of the gulp console, i.e. last 50 lines**.
13
+
14
+ > steps to enter gulp CLI for docker version:
15
+ > ~~~bash
16
+ > docker run --rm -it --entrypoint bash mentatis/gulp-core:latest
17
+ > ~~~
18
+
19
+ **To Reproduce**
20
+
21
+ Steps to reproduce the behavior, i.e.
22
+
23
+ 1. Go to '...'
24
+ 2. Click on '....'
25
+ 3. Scroll down to '....'
26
+ 4. ...
27
+
28
+ **Expected behavior**
29
+
30
+ A clear and concise description of what you expected to happen.
31
+
32
+ **Screenshots**
33
+
34
+ If applicable, add screenshots to help explain your problem.
35
+
36
+ **Version**
37
+
38
+ - OS
39
+ - Browser
40
+ - Gulp Version (`python3 -m gulp --version` from the CLI)
41
+
42
+ **Additional context**
43
+
44
+ Add any other context about the problem here.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,31 @@
1
+ # gULP — Copilot instructions for coding agents
2
+
3
+ gULP is a Python FastAPI service + workers that stores documents in OpenSearch and keeps collaboration metadata in PostgreSQL; Redis is used for the task queue & pub/sub. (see `docs/architecture.md`).
4
+
5
+ - Main code lives in `src/gulp/` — important entry points: `src/gulp/__main__.py` (CLI), `src/gulp/api/server_api.py` (FastAPI server), `src/gulp/plugin.py` (plugin base).
6
+ - Separate repositories are symlinked for the client SDK (`gulp-sdk/`), non-free plugins (`gulp-paid-plugins`), and utility library (`muty-python/`).
7
+
8
+ ## General instructions for coding agents 🤖
9
+ - **ALWAYS** use memory to track progress and decisions made during implementation
10
+
11
+ ## Testing instructions
12
+ - for tests, a gulp instance should be available on `localhost:8080`.
13
+ - **if you cannot find the instance, you can start it with `gulp --reset-collab --create test_operation`, make sure to run the command inside the venv. any plugin extension startup errors can be ignored. be sure to stop the instance with `gulp --stop` when done.**
14
+ - for authentication, initially only the `admin/admin` user (admin permissions) and `guest/guest` (read-only, i.e. no ingestion) are available
15
+ - **after authentication, (most of) the gulp API requires that a websocket connection is started.**
16
+ - for file ingestion tests, use the files in `/gulp/samples/win_evtx` with the `win_evtx` plugin
17
+ - to test the ingest raw API, use a json with different `GulpDocument`s. test both the `/ingest_raw` API and the websocket version `/ws_ingest_raw`
18
+ - to test the query_external API, use the `query_elasticsearch` plugin using the local gulp instance (setting the necessary parameters in the plugin, i.e. configure it for opensearch): for example, ingest some test documents with win_evtx first, then call `/query_external` with `query_elasticsearch` plugin to retrieve them
19
+ - to test different `plugin_params` parameters during ingestion, use the `csv` plugin, see as an example the test inside `/gulp/tests_old/ingest/test_ingest.py in the `test_csv_standalone`, `test_csv_file_mapping` methods
20
+ - **in every test, always make sure to verify that (for example) data has been ingested (i.e. via query), and make sure that any data created on collab is deleted (for example, if you create an operation, make sure to delete it at the end of the test)**
21
+ - **make sure that any temporary files created during tests are deleted at the end of the test**
22
+ - **always make sure at the beginning of each test to start from a clean state, for example by creating new operations or new documents with unique IDs, so as not to have interference with pre-existing data or with other tests**
23
+ - **if you suspect bugs in the gulp backend, or if you notice strange behavior during tests, document them, stop and ask for clarifications**
24
+
25
+ ## Adding / changing functionality — checklist for PRs ✍️
26
+ 1. Update or add unit/integration tests under `tests/` (look at `tests/ingest/`, `tests/query/`, `tests/enrich/, `tests/extension/`).
27
+ 2. If plugin or mapping changes, add/update mapping in `mapping_files/` and tests that use `GulpMappingParameters`.
28
+ 3. If DB schema changes, add migration under `collab_migrate/`.
29
+ 4. Ensure tests starts with a clean state (use pytest fixtures as i.e. in `tests/ingest/test_ingest.py:::_setup` or `--reset-collab --create test_operation` to start gulp in a clean state with a test operation).
30
+ 5. Run tests and ensure they pass before submitting PR.
31
+
@@ -0,0 +1,61 @@
1
+ name: docker-ci
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ tags:
8
+ - 'v[0-9]+.[0-9]+.[0-9]+'
9
+ # enables manual trigger
10
+ workflow_dispatch:
11
+
12
+ env:
13
+ DOCKER_REPOSITORY: mentatis
14
+ DOCKER_IMAGE_NAME: gulp-core
15
+ PYTHON_VERSION: 3.13
16
+
17
+ jobs:
18
+ docker:
19
+ name: Docker
20
+ runs-on: ubuntu-latest
21
+ # makes sure it doesn't finish the minutes quota if stalls
22
+ timeout-minutes: 10
23
+ steps:
24
+ - name: Checkout repository
25
+ uses: actions/checkout@v4
26
+ with:
27
+ submodules: recursive
28
+
29
+ - name: Get Docker tag (git version)
30
+ id: get-docker-tag
31
+ run: |
32
+ GIT_DESCRIBE=$(git describe --tags --always)
33
+ echo "git_version=${GIT_DESCRIBE}" >> ${GITHUB_OUTPUT}
34
+
35
+ - name: Output Docker tag
36
+ run: echo ${{ steps.get-docker-tag.outputs.git_version }}
37
+
38
+ - name: Get app version
39
+ id: vars
40
+ run: |
41
+ echo "version=$(git describe --tags --always)" >> $GITHUB_OUTPUT
42
+
43
+ - name: Login to Docker Hub
44
+ uses: docker/login-action@v3
45
+ with:
46
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
47
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
48
+
49
+ - name: Build and push [${{ env.DOCKER_IMAGE_NAME }}]
50
+ uses: docker/build-push-action@v6
51
+ with:
52
+ context: .
53
+ push: true
54
+ no-cache: true
55
+ progress: plain
56
+ build-args: |
57
+ _VERSION=${{ steps.vars.outputs.version }}
58
+ tags: |
59
+ ${{ env.DOCKER_REPOSITORY }}/${{ env.DOCKER_IMAGE_NAME }}:latest
60
+ ${{ env.DOCKER_REPOSITORY }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.vars.outputs.version }}
61
+
@@ -0,0 +1,75 @@
1
+ name: Python package
2
+
3
+ on:
4
+ push:
5
+ tags: ['v*', 'test-v*']
6
+ workflow_dispatch: {}
7
+
8
+ jobs:
9
+ test:
10
+ name: Test, lint and build
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout repository
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: '3.13'
20
+
21
+ - name: Install dependencies
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ python -m pip install build setuptools_scm[toml] pytest
25
+
26
+ # TODO: write proper muty-python tests and enable this step
27
+ #- name: Run tests
28
+ # run: |
29
+ # pytest -q
30
+
31
+ - name: Build artifacts
32
+ run: |
33
+ python -m build
34
+
35
+ - name: Check package
36
+ run: |
37
+ python -m pip install twine
38
+ python -m twine check dist/*
39
+
40
+ publish:
41
+ name: Publish to PyPI
42
+ needs: test
43
+ runs-on: ubuntu-latest
44
+ if: startsWith(github.ref, 'refs/tags/v') || startsWith(github.ref, 'refs/tags/test-v')
45
+ steps:
46
+ - name: Checkout repository
47
+ uses: actions/checkout@v4
48
+
49
+ - name: Set up Python
50
+ uses: actions/setup-python@v5
51
+ with:
52
+ python-version: '3.13'
53
+
54
+ - name: Install packaging dependencies
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ python -m pip install build setuptools_scm[toml] twine
58
+
59
+ - name: Build
60
+ run: |
61
+ python -m build
62
+
63
+ - name: Publish to PyPI
64
+ env:
65
+ TWINE_USERNAME: __token__
66
+ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN_VALERINO }}
67
+ TWINE_PASSWORD_TEST: ${{ secrets.PYPI_API_TEST_TOKEN_VALERINO }}
68
+ run: |
69
+ if [[ "${GITHUB_REF##*/}" == test-v* ]]; then
70
+ export TWINE_PASSWORD="${TWINE_PASSWORD_TEST}"
71
+ python -m twine upload --verbose --repository-url https://test.pypi.org/legacy/ dist/*
72
+ else
73
+ export TWINE_PASSWORD="${TWINE_PASSWORD}"
74
+ python -m twine upload --verbose dist/*
75
+ fi
@@ -0,0 +1,51 @@
1
+ # Python
2
+ __pycache__
3
+ *.pyc
4
+ *.pyo
5
+ *.pyd
6
+ .venv
7
+ pyrightconfig.json
8
+ venv
9
+ dist
10
+
11
+ # VSCode
12
+ .vscode/
13
+
14
+ # symlinks
15
+ gulp-paid-plugins
16
+ slurp
17
+ gulpui-web
18
+ # gulp-sdk-python
19
+
20
+ #auto generated docs
21
+ docs/html
22
+ .VSCodeCounter
23
+
24
+ # native
25
+ src/gulp/libgulp
26
+ *.so
27
+
28
+ # misc
29
+ .github/agents
30
+ export.csv
31
+ export.json
32
+ gulp_cfg.json
33
+ *.egg-info
34
+ test.py
35
+ build
36
+ .DS_Store
37
+ *log*.txt
38
+ output.txt
39
+ start_splunk.sh
40
+ supported_formats.md
41
+ build_paid.sh
42
+ prompts.txt
43
+ tests/query/sigma/windows
44
+ build_test.sh
45
+ .specstory
46
+ .coverage
47
+ gulp-cli
48
+ muty-python
49
+ gulp-sdk
50
+ *plan*.md
51
+ _version.py
@@ -0,0 +1,84 @@
1
+ # v1.6.51
2
+
3
+ ## new features
4
+
5
+ - architecture: observability via `Prometheus` metrics and `Grafana` dashboards (check the `docs/observability.md` for instructions)
6
+ - core: added `synchronous` internal events callback, allows extension plugins to i.e. change chunks of documents during ingestion via `EVENT_CHUNK_PRE_INGEST` event
7
+ - sdk: deprecated the old `gulp-sdk-python` and integrated new polished python SDK available at https://github.com/mentat-is/gulp-sdk, integration tests in `/tests` as usual (missing most of the old per-plugin tests, will be updated soon)
8
+ - installation: removed submodules, welcome pypi installation! our Mentat's dependencies `gulp-sdk` and `muty-python` packages and also gulp itself (`mentat-gulp`) are now on pypi, check the [installation instructions](./docs/install_dev.md) for details.
9
+ - cli: `gulp-cli` is now available to use most of the gulp features from the command line, get it at https://github.com/mentat-is/gulp-cli or via the `gulp-cli` package on pypi!
10
+
11
+ - ci/cd: added github workflows to build pypi packages
12
+
13
+ ## bugfixes
14
+
15
+ - core/logging: fixed syslog logging (integrated rsyslog both in the devcontainer and production Dockerfile deployment)
16
+ - core/redis: reworked message routing and handling
17
+ - all: multiple fixes
18
+
19
+ # v1.6.5
20
+
21
+ ## new features
22
+
23
+ - architecture: filestore via `minio` S3-compatible storage to be used by plugins to store binary files needed for the analysis (configuration must be updated, check the `gulp_cfg_template.json`)
24
+ - architecture: removed `sftpd` from the default set of microservices (a management console may use the new API endpoints instead)
25
+ - plugins/pcap: reworked to use the filestore
26
+ - core/api: new API endpoints, `remove_enrich` to remove enriched data, endpoints to manage plugin/config/mapping files (`plugin_delete`, `plugin_upload`, `plugin_download`, `config_upload`, `config_download`, `mapping_file_delete_upload`), `mapping_file_download`, `mapping_file_delete`, endpoints to manage files from storage (`storage_delete_by_id`, `storage_get_file_by_id`, `storage_delete_by_tags`, `storage_list_files`)
27
+
28
+ ## bugfixes
29
+
30
+ - **fixed a very long standing bug which leaked resources at every `ingest` operation and prevented clean shutdown of workers**.
31
+
32
+ # v1.6.2
33
+
34
+ ## new features
35
+
36
+ - realtime ingestion supported in the UI
37
+ - new plugin: `otel_receiver` to ingest OpenTelemetry traces, logs and metrics from an OpenTelemetry Collector
38
+
39
+ ## improvements
40
+
41
+ - core/query: major boost in parallel query handling and overall performance improvements (Redis)
42
+ - core/collab: refactored advisory locks to be more robust and performant (PostgreSQL)
43
+ - core/mapping: added `mapping.fields.timestamp_format` and `mapping.default_encoding` to the mapping engine, to respectively use a default timestamp format string and string encoding
44
+
45
+ ## unresolved issues
46
+
47
+ `timestamp_format` in `plugin_params` is currently **NOT SUPPORTED** in the UI: in the `regex` plugin it is workarounded passing it via `plugin_params.custom_parameters`, other plugins using it (i.e. `apache_access_clf`) have hardcoded defaults (which is, of course, not ideal and will be fixed ASAP when the UI issue is resolved).
48
+
49
+ # v1.6.1
50
+
51
+ ## fixes
52
+
53
+ - solves issues with the devcontainer (https://github.com/yarnpkg/yarn/issues/9216)
54
+ - some minor fixes
55
+
56
+ # v1.6.0
57
+
58
+ ## major changes
59
+
60
+ - core: introducing redis instead of a shared multiprocessing queue to exchange messages core<->workers - (major speedup and less memory usage!)
61
+ - core: scaling horizontally using multiple instances of the core running simultaneously
62
+ - plugins: allow caching and reusing values through `DocValueCache` in `plugin.py` (major speedup when used properly)
63
+ - core: properly structured `GulpDocument`
64
+ - api/ws: introducing WebSocket API for real-time ingestion `/ingest_ws_raw` (allow i.e. real-time ingestion from network sensors, try https://github.com/mentat-is/slurp-ebpf)
65
+
66
+ ## changes/improvements
67
+
68
+ - all: our internal repos `muty-python` and `gulp-sdk-python` now included as submodules
69
+ - core/collab: upgraded to OpenSearch latest (3.x)
70
+ - core/collab: reworked most of the collab code to be more SQLAlchemy compliant
71
+ - core/collab: stats (GulpRequestStats) processing completely reworked (now they are updated consistently across the whole modules)
72
+ - core/mapping: allowing aliasies to be applied post-mapping (`value_aliases` in the mapping files/definitions)
73
+ - core/mapping: support for windows filetime for `timestamp` fields
74
+ - core/api: added `query_aggregation` to the API to allow aggregation queries
75
+ core/ws: better backpressure handling for higher loads
76
+
77
+ ## plugins
78
+
79
+ - plugins/extension: `ai-assistant` to help analsyts with investigations using LLMs (OpenRouter API support)
80
+ - plugins/ingestion: `suricata`, `memprocfs`, `zeek` ingestion plugins/mappings added
81
+
82
+ ## all
83
+
84
+ - all: generic fixes and improvements across the whole codebase
@@ -0,0 +1,82 @@
1
+ # Contributing To Gulp
2
+
3
+ We'd love the the community to be part of our project both as developers and as users!
4
+
5
+ ## For developers
6
+
7
+ To submit PRs, just stick with these simple rules:
8
+
9
+ 1. follow [the install docs for developers](<./docs/install_dev.md>) to setup the dev environment.
10
+ 2. `be modular!`
11
+ 3. use (*and extend it*, you are welcome!) our utility library [muty-python](https://github.com/mentat-is/muty-python) instead of repeating common code, or to abstract complex functionality.
12
+ 4. use FFI if you need performances, i.e. as the [win_evtx](https://github.com/mentat-is/src/gulp/plugins/ingestion/win_evtx.py) plugin which uses a [pyevtx-rs rust's backend](https://github.com/omerbenamram/pyevtx-rs)
13
+
14
+ and code writing guidilines:
15
+
16
+ 1. **Readability first** – write code as if the next maintainer has no context.
17
+ - **No one-liner lambdas or list-comprehension trick-shots** unless the gain in performance is *dramatic*.
18
+ - **Extensively comment code (function names, methods, variables, code flow, separate lines in logical blocks)**, except the obvious.
19
+ - **Type hint everything** (functions, methods, variables, class attributes).
20
+
21
+ this is **accepted** code:
22
+
23
+ ```python
24
+ def connect_to_next_port(self, minimum: int) -> int:
25
+ """Connects to the next available port.
26
+
27
+ Args:
28
+ minimum: A port value greater or equal to 1024.
29
+
30
+ Returns:
31
+ The new minimum port.
32
+
33
+ Raises:
34
+ ConnectionError: If no available port is found.
35
+ """
36
+ if minimum < 1024:
37
+ # ports below 1024 are reserved.
38
+ raise ValueError("Min. port must be at least 1024, not {minimum}.")
39
+
40
+ port = self._find_next_open_port(minimum)
41
+ if port is None:
42
+ # no port provided
43
+ raise ConnectionError(
44
+ f'Could not connect to service on port {minimum} or higher.')
45
+
46
+ if port < minimum:
47
+ # sanity check
48
+ raise RuntimeError(
49
+ f'Unexpected port {port} when minimum was {minimum}.')
50
+ return port
51
+ ```
52
+
53
+ this code is **NOT** accepted:
54
+
55
+ ```python
56
+ def connect_to_next_port(self, minimum):
57
+ if minimum < 1024:
58
+ raise ValueError()
59
+ port = self._find_next_open_port(minimum)
60
+ if port is None:
61
+ raise ConnectionError()
62
+ assert port >= minimum
63
+ return port
64
+ ```
65
+
66
+ 2. **Tests in `tests/`**
67
+ - Put integration tests in `tests/` and generic test-helper scripts in `test_scripts/`
68
+ - Use `pytest` conventions (`test_*.py`, fixtures, parametrization).
69
+
70
+ 3. use [microsoft's black](https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter) formatter with the default settings.
71
+
72
+ ### notes for mantainers
73
+
74
+ - > at release/tag time, use [the provided script](./update_requirements.txt) to freeze python requirements, **force push it to the target branch** and recreate the docker image.
75
+
76
+ ## Bug reporting
77
+
78
+ 1. `gulp --version`
79
+ 1. if [you are a developer](<./docs/install_dev.md>), output of the above command may not be correct if you updated the repository/ies manually: so, please provide the last commit hash of your local `gulp` and `muty-python` repositories.
80
+ 2. error dump from gulp's console, `issues with "this/that does not work" missing an error dump will be rejected`.
81
+ 3. steps for reproducing, `including OS flavor (linux, WSL, macos, ...), arch and version`.
82
+