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.
- mentat_gulp-1.6.51/.devcontainer/Dockerfile +31 -0
- mentat_gulp-1.6.51/.devcontainer/devcontainer.json +60 -0
- mentat_gulp-1.6.51/.devcontainer/devsetup.sh +35 -0
- mentat_gulp-1.6.51/.devcontainer/docker-compose.yml +22 -0
- mentat_gulp-1.6.51/.env +23 -0
- mentat_gulp-1.6.51/.gitattributes +3 -0
- mentat_gulp-1.6.51/.github/ISSUE_TEMPLATE/bug_report.md +44 -0
- mentat_gulp-1.6.51/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- mentat_gulp-1.6.51/.github/copilot-instructions.md +31 -0
- mentat_gulp-1.6.51/.github/workflows/docker-ci.yml +61 -0
- mentat_gulp-1.6.51/.github/workflows/python-package.yml +75 -0
- mentat_gulp-1.6.51/.gitignore +51 -0
- mentat_gulp-1.6.51/CHANGELOG.md +84 -0
- mentat_gulp-1.6.51/CONTRIBUTING.md +82 -0
- mentat_gulp-1.6.51/DATASHEET.md +177 -0
- mentat_gulp-1.6.51/Dockerfile +74 -0
- mentat_gulp-1.6.51/Doxyfile +310 -0
- mentat_gulp-1.6.51/LICENSE.AGPL-3.0.txt +208 -0
- mentat_gulp-1.6.51/LICENSE.GULP.txt +54 -0
- mentat_gulp-1.6.51/LICENSE.md +4 -0
- mentat_gulp-1.6.51/MANIFEST.in +3 -0
- mentat_gulp-1.6.51/PKG-INFO +381 -0
- mentat_gulp-1.6.51/README.md +233 -0
- mentat_gulp-1.6.51/checkout_branch.sh +25 -0
- mentat_gulp-1.6.51/collab_migrate/1.5.1/migrate.py +369 -0
- mentat_gulp-1.6.51/collab_migrate/1.6.6/migrate.py +120 -0
- mentat_gulp-1.6.51/collab_migrate/example_migrate_collab.py +176 -0
- mentat_gulp-1.6.51/docker-compose.yml +224 -0
- mentat_gulp-1.6.51/docker-entrypoint.sh +17 -0
- mentat_gulp-1.6.51/docs/architecture.md +301 -0
- mentat_gulp-1.6.51/docs/install_dev.md +189 -0
- mentat_gulp-1.6.51/docs/install_docker.md +79 -0
- mentat_gulp-1.6.51/docs/integration.md +73 -0
- mentat_gulp-1.6.51/docs/observability.md +83 -0
- mentat_gulp-1.6.51/docs/plugins/ai_assistant.md +124 -0
- mentat_gulp-1.6.51/docs/plugins/bridge_manager.md +561 -0
- mentat_gulp-1.6.51/docs/plugins/csv.py.md +107 -0
- mentat_gulp-1.6.51/docs/plugins/enrich_abuse.md +44 -0
- mentat_gulp-1.6.51/docs/plugins/enrich_circl_hash.md +21 -0
- mentat_gulp-1.6.51/docs/plugins/json.py.md +98 -0
- mentat_gulp-1.6.51/docs/plugins/otel_receiver.md +115 -0
- mentat_gulp-1.6.51/docs/plugins/query_elasticsearch.md +121 -0
- mentat_gulp-1.6.51/docs/plugins/regex.py.md +92 -0
- mentat_gulp-1.6.51/docs/plugins/win_pe.py.md +96 -0
- mentat_gulp-1.6.51/docs/plugins/zip.py.md +99 -0
- mentat_gulp-1.6.51/docs/plugins_and_mapping.md +742 -0
- mentat_gulp-1.6.51/docs/query.md +62 -0
- mentat_gulp-1.6.51/docs/testing.md +105 -0
- mentat_gulp-1.6.51/docs/troubleshooting.md +237 -0
- mentat_gulp-1.6.51/gulp.code-workspace +29 -0
- mentat_gulp-1.6.51/logo.svg +106 -0
- mentat_gulp-1.6.51/prometheus.yml +12 -0
- mentat_gulp-1.6.51/pyproject.toml +185 -0
- mentat_gulp-1.6.51/reset_docker.sh +22 -0
- mentat_gulp-1.6.51/samples/apache_clf/access.log +1311 -0
- mentat_gulp-1.6.51/samples/apache_clf/error.log +1178 -0
- mentat_gulp-1.6.51/samples/chrome_history_sqlite_stacked/History +0 -0
- mentat_gulp-1.6.51/samples/chrome_webdata_sqlite_stacked/Web Data +0 -0
- mentat_gulp-1.6.51/samples/eml/sample.eml +64 -0
- mentat_gulp-1.6.51/samples/iis_access/iis.log +2 -0
- mentat_gulp-1.6.51/samples/iis_access_ncsa/iis_ncsa.log +4 -0
- mentat_gulp-1.6.51/samples/iis_access_w3c/iis_w3c.log +9 -0
- mentat_gulp-1.6.51/samples/json/generate_list.py +91 -0
- mentat_gulp-1.6.51/samples/json/jsondict.json +11 -0
- mentat_gulp-1.6.51/samples/json/jsonline.json +5 -0
- mentat_gulp-1.6.51/samples/json/jsonlist.json +7 -0
- mentat_gulp-1.6.51/samples/json/test_list.json +1 -0
- mentat_gulp-1.6.51/samples/lin_syslog/auth.log +70 -0
- mentat_gulp-1.6.51/samples/lin_syslog/syslog +2548 -0
- mentat_gulp-1.6.51/samples/mbox/sample.mbox +685 -0
- mentat_gulp-1.6.51/samples/memprocfs/ntfs_files.txt +34 -0
- mentat_gulp-1.6.51/samples/memprocfs/timeline_all.txt +77140 -0
- mentat_gulp-1.6.51/samples/memprocfs/timeline_little.txt +3 -0
- mentat_gulp-1.6.51/samples/memprocfs/web.txt +31 -0
- mentat_gulp-1.6.51/samples/mftecmd/sample_j.csv +76 -0
- mentat_gulp-1.6.51/samples/mftecmd/sample_record.csv +11 -0
- mentat_gulp-1.6.51/samples/mysql_error/mysql_error.log +63 -0
- mentat_gulp-1.6.51/samples/mysql_general/example.general.log +4056 -0
- mentat_gulp-1.6.51/samples/pcap/220614_ip_flags_google.pcapng +0 -0
- mentat_gulp-1.6.51/samples/pfsense/filter.log +61 -0
- mentat_gulp-1.6.51/samples/sqlite/chrome_history +0 -0
- mentat_gulp-1.6.51/samples/sqlite/chrome_webdata +0 -0
- mentat_gulp-1.6.51/samples/suricata/eve.json +285 -0
- mentat_gulp-1.6.51/samples/suricata/eve_long.json +7775 -0
- mentat_gulp-1.6.51/samples/suricata/fast.log +9 -0
- mentat_gulp-1.6.51/samples/systemd_journal/system.journal +0 -0
- mentat_gulp-1.6.51/samples/teamviewer/connections_incoming.txt +2 -0
- mentat_gulp-1.6.51/samples/win_evtx/2-system-Microsoft-Windows-LiveId%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/2-system-Security-dirty.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/2-vss_0-Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/2-vss_0-Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/2-vss_7-System.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Application.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Application_no_crc32.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Archive-ForwardedEvents-test.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/E_ShadowCopy6_windows_system32_winevt_logs_Microsoft-Windows-CAPI2%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/E_Windows_system32_winevt_logs_Microsoft-Windows-CAPI2%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/E_Windows_system32_winevt_logs_Microsoft-Windows-Shell-Core%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/MSExchange_Management_wec.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Microsoft-Windows-HelloForBusiness%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Microsoft-Windows-LanguagePackSetup%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/Security_short_selected.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/issue_201.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/new-user-security.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/post-Security.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/sample-with-irregular-bool-values.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/sample_with_a_bad_chunk_magic.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/security.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/security_big_sample.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/sysmon.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_evtx/system.evtx +0 -0
- mentat_gulp-1.6.51/samples/win_reg/NTUSER.DAT +0 -0
- mentat_gulp-1.6.51/samples/zeek/conn.log +34 -0
- mentat_gulp-1.6.51/samples/zeek/dce_rpc.log +3 -0
- mentat_gulp-1.6.51/samples/zeek/dhcp.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/dns.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/files.log +11 -0
- mentat_gulp-1.6.51/samples/zeek/ftp.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/http.log +5 -0
- mentat_gulp-1.6.51/samples/zeek/irc.log +11 -0
- mentat_gulp-1.6.51/samples/zeek/kerberos.log +5 -0
- mentat_gulp-1.6.51/samples/zeek/known_certs.log +1 -0
- mentat_gulp-1.6.51/samples/zeek/known_hosts.log +5 -0
- mentat_gulp-1.6.51/samples/zeek/known_services.log +20 -0
- mentat_gulp-1.6.51/samples/zeek/ldap.log +2 -0
- mentat_gulp-1.6.51/samples/zeek/ldap_search.log +1 -0
- mentat_gulp-1.6.51/samples/zeek/notice.log +6 -0
- mentat_gulp-1.6.51/samples/zeek/ntlm.log +7 -0
- mentat_gulp-1.6.51/samples/zeek/ntp.log +2 -0
- mentat_gulp-1.6.51/samples/zeek/packet_filter.log +0 -0
- mentat_gulp-1.6.51/samples/zeek/pe.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/postgresql.log +3 -0
- mentat_gulp-1.6.51/samples/zeek/quic.log +1 -0
- mentat_gulp-1.6.51/samples/zeek/rdp.log +1 -0
- mentat_gulp-1.6.51/samples/zeek/smb_files.log +7 -0
- mentat_gulp-1.6.51/samples/zeek/smb_mapping.log +5 -0
- mentat_gulp-1.6.51/samples/zeek/smtp.log +2 -0
- mentat_gulp-1.6.51/samples/zeek/software.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/ssh.log +5 -0
- mentat_gulp-1.6.51/samples/zeek/ssl.log +13 -0
- mentat_gulp-1.6.51/samples/zeek/traceroute.log +4 -0
- mentat_gulp-1.6.51/samples/zeek/tunnel.log +8 -0
- mentat_gulp-1.6.51/samples/zeek/weird.log +2 -0
- mentat_gulp-1.6.51/samples/zeek/x509.log +7 -0
- mentat_gulp-1.6.51/screenshot-1.png +0 -0
- mentat_gulp-1.6.51/screenshot-2.png +0 -0
- mentat_gulp-1.6.51/screenshot-3.png +0 -0
- mentat_gulp-1.6.51/setup.cfg +4 -0
- mentat_gulp-1.6.51/src/gulp/__init__.py +14 -0
- mentat_gulp-1.6.51/src/gulp/__main__.py +226 -0
- mentat_gulp-1.6.51/src/gulp/_version.py +24 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/assets/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/assets/icons.txt +1900 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/context.py +222 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/enhance_doc_map.py +29 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/field_types_entry.py +99 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/glyph.py +57 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/highlight.py +139 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/link.py +40 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/mapping_parameters.py +81 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/note.py +352 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/operation.py +320 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/source.py +116 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/source_field_types.py +177 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/stats.py +784 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/structs.py +2118 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/user.py +590 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/user_group.py +197 -0
- mentat_gulp-1.6.51/src/gulp/api/collab/user_session.py +307 -0
- mentat_gulp-1.6.51/src/gulp/api/collab_api.py +636 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/index_template/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/index_template/template.json +7793 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/models.py +326 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/templates/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/mapping/templates/ecs_template.json +7793 -0
- mentat_gulp-1.6.51/src/gulp/api/opensearch/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/opensearch/filters.py +392 -0
- mentat_gulp-1.6.51/src/gulp/api/opensearch/sigma.py +832 -0
- mentat_gulp-1.6.51/src/gulp/api/opensearch/structs.py +808 -0
- mentat_gulp-1.6.51/src/gulp/api/opensearch_api.py +2333 -0
- mentat_gulp-1.6.51/src/gulp/api/prometheus_api.py +495 -0
- mentat_gulp-1.6.51/src/gulp/api/redis_api.py +1405 -0
- mentat_gulp-1.6.51/src/gulp/api/s3_api.py +719 -0
- mentat_gulp-1.6.51/src/gulp/api/server/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/api/server/db.py +618 -0
- mentat_gulp-1.6.51/src/gulp/api/server/enrich.py +979 -0
- mentat_gulp-1.6.51/src/gulp/api/server/glyph.py +296 -0
- mentat_gulp-1.6.51/src/gulp/api/server/highlight.py +333 -0
- mentat_gulp-1.6.51/src/gulp/api/server/ingest.py +1662 -0
- mentat_gulp-1.6.51/src/gulp/api/server/link.py +327 -0
- mentat_gulp-1.6.51/src/gulp/api/server/note.py +389 -0
- mentat_gulp-1.6.51/src/gulp/api/server/object_acl.py +414 -0
- mentat_gulp-1.6.51/src/gulp/api/server/operation.py +1104 -0
- mentat_gulp-1.6.51/src/gulp/api/server/query.py +2132 -0
- mentat_gulp-1.6.51/src/gulp/api/server/server_utils.py +364 -0
- mentat_gulp-1.6.51/src/gulp/api/server/storage.py +289 -0
- mentat_gulp-1.6.51/src/gulp/api/server/structs.py +638 -0
- mentat_gulp-1.6.51/src/gulp/api/server/user.py +1107 -0
- mentat_gulp-1.6.51/src/gulp/api/server/user_group.py +440 -0
- mentat_gulp-1.6.51/src/gulp/api/server/utility.py +1406 -0
- mentat_gulp-1.6.51/src/gulp/api/server/ws.py +918 -0
- mentat_gulp-1.6.51/src/gulp/api/server_api.py +885 -0
- mentat_gulp-1.6.51/src/gulp/api/ws_api.py +2348 -0
- mentat_gulp-1.6.51/src/gulp/config.py +1284 -0
- mentat_gulp-1.6.51/src/gulp/gulp.py +8 -0
- mentat_gulp-1.6.51/src/gulp/gulp_cfg_template.json +161 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/__init__.py +0 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/apache_access_clf.json +49 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/apache_error_clf.json +31 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_usbdevices.json +30 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_webform_autofill.json +27 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/autopsy_webhistory.json +36 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/chrome_history.json +94 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/chrome_webdata.json +29 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/firefox_sqlite.json +24 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/hayabusa_csv.json +62 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/jlecmd_csv.json +108 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/lecmd_csv.json +49 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/lin_syslog.json +24 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/mem_proc_fs.json +51 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/mftecmd_csv.json +137 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/otel.json +1020 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/pcap.json +134 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/pecmd_csv.json +78 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/plaso_csv.json +91 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/recent_file_cache_parser_csv.json +27 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/srumecmd.json +110 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/suricata.json +463 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/systemd_journal.json +37 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/volatility_csv.json +223 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/wazuh.json +375 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/windows.json +775 -0
- mentat_gulp-1.6.51/src/gulp/mapping_files/zeek.json +1950 -0
- mentat_gulp-1.6.51/src/gulp/plugin.py +4033 -0
- mentat_gulp-1.6.51/src/gulp/plugins/__init__.py +1 -0
- mentat_gulp-1.6.51/src/gulp/plugins/apache_access_clf.py +198 -0
- mentat_gulp-1.6.51/src/gulp/plugins/apache_error_clf.py +158 -0
- mentat_gulp-1.6.51/src/gulp/plugins/chrome_history_sqlite_stacked.py +160 -0
- mentat_gulp-1.6.51/src/gulp/plugins/chrome_webdata_sqlite_stacked.py +161 -0
- mentat_gulp-1.6.51/src/gulp/plugins/csv.py +173 -0
- mentat_gulp-1.6.51/src/gulp/plugins/eml.py +192 -0
- mentat_gulp-1.6.51/src/gulp/plugins/enrich_abuse.py +326 -0
- mentat_gulp-1.6.51/src/gulp/plugins/enrich_circl_hash.py +256 -0
- mentat_gulp-1.6.51/src/gulp/plugins/enrich_example.py +116 -0
- mentat_gulp-1.6.51/src/gulp/plugins/enrich_whois.py +827 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/__init__.py +1 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/ai_assistant.py +376 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/bridge_manager.py +862 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/example_chunk_callbacks.py +69 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/example_extension.py +203 -0
- mentat_gulp-1.6.51/src/gulp/plugins/extension/otel_receiver.py +836 -0
- mentat_gulp-1.6.51/src/gulp/plugins/iis_access.py +155 -0
- mentat_gulp-1.6.51/src/gulp/plugins/iis_access_ncsa.py +140 -0
- mentat_gulp-1.6.51/src/gulp/plugins/iis_access_w3c.py +139 -0
- mentat_gulp-1.6.51/src/gulp/plugins/json.py +284 -0
- mentat_gulp-1.6.51/src/gulp/plugins/lin_syslog.py +150 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mbox.py +123 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs.py +162 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs_ntfs.py +173 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mem_proc_fs_web.py +146 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mysql_error.py +145 -0
- mentat_gulp-1.6.51/src/gulp/plugins/mysql_general.py +304 -0
- mentat_gulp-1.6.51/src/gulp/plugins/pcap.py +370 -0
- mentat_gulp-1.6.51/src/gulp/plugins/pfsense.py +288 -0
- mentat_gulp-1.6.51/src/gulp/plugins/query_elasticsearch.py +576 -0
- mentat_gulp-1.6.51/src/gulp/plugins/raw.py +147 -0
- mentat_gulp-1.6.51/src/gulp/plugins/regex.py +185 -0
- mentat_gulp-1.6.51/src/gulp/plugins/sqlite.py +284 -0
- mentat_gulp-1.6.51/src/gulp/plugins/stacked_example.py +97 -0
- mentat_gulp-1.6.51/src/gulp/plugins/stacked_on_stacked_example.py +93 -0
- mentat_gulp-1.6.51/src/gulp/plugins/suricata_fast_log.py +156 -0
- mentat_gulp-1.6.51/src/gulp/plugins/systemd_journal.py +153 -0
- mentat_gulp-1.6.51/src/gulp/plugins/teamviewer_regex_stacked.py +131 -0
- mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_plugin.tsx +1 -0
- mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_plugin.tsx.json +7 -0
- mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_send_data_plugin.tsx +89 -0
- mentat_gulp-1.6.51/src/gulp/plugins/ui/example_ui_send_data_plugin.tsx.json +12 -0
- mentat_gulp-1.6.51/src/gulp/plugins/win_evtx.py +236 -0
- mentat_gulp-1.6.51/src/gulp/plugins/win_pe.py +211 -0
- mentat_gulp-1.6.51/src/gulp/plugins/win_reg.py +190 -0
- mentat_gulp-1.6.51/src/gulp/plugins/zip.py +220 -0
- mentat_gulp-1.6.51/src/gulp/process.py +402 -0
- mentat_gulp-1.6.51/src/gulp/structs.py +440 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/PKG-INFO +381 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/SOURCES.txt +364 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/dependency_links.txt +1 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/entry_points.txt +2 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/requires.txt +139 -0
- mentat_gulp-1.6.51/src/mentat_gulp.egg-info/top_level.txt +1 -0
- mentat_gulp-1.6.51/test_scripts/__init__.py +0 -0
- mentat_gulp-1.6.51/test_scripts/count_data_chunk.py +14 -0
- mentat_gulp-1.6.51/test_scripts/count_json.py +11 -0
- mentat_gulp-1.6.51/test_scripts/count_lines.py +57 -0
- mentat_gulp-1.6.51/test_scripts/count_strings.py +37 -0
- mentat_gulp-1.6.51/test_scripts/create_mutated_raw.py +320 -0
- mentat_gulp-1.6.51/test_scripts/evtx_count.py +51 -0
- mentat_gulp-1.6.51/test_scripts/ingest.py +371 -0
- mentat_gulp-1.6.51/test_scripts/ingest_raw.py +147 -0
- mentat_gulp-1.6.51/test_scripts/log_into_devcontainer.sh +3 -0
- mentat_gulp-1.6.51/test_scripts/query_external.py +211 -0
- mentat_gulp-1.6.51/test_scripts/run_tests.sh +45 -0
- mentat_gulp-1.6.51/tests/__init__.py +3 -0
- mentat_gulp-1.6.51/tests/conftest.py +65 -0
- mentat_gulp-1.6.51/tests/e2e/test_workflows.py +82 -0
- mentat_gulp-1.6.51/tests/integration/test_acl.py +197 -0
- mentat_gulp-1.6.51/tests/integration/test_auth.py +76 -0
- mentat_gulp-1.6.51/tests/integration/test_collab.py +369 -0
- mentat_gulp-1.6.51/tests/integration/test_db.py +148 -0
- mentat_gulp-1.6.51/tests/integration/test_enrich.py +267 -0
- mentat_gulp-1.6.51/tests/integration/test_ingest_win_evtx.py +373 -0
- mentat_gulp-1.6.51/tests/integration/test_operations.py +467 -0
- mentat_gulp-1.6.51/tests/integration/test_plugins.py +478 -0
- mentat_gulp-1.6.51/tests/integration/test_queries.py +401 -0
- mentat_gulp-1.6.51/tests/integration/test_storage.py +188 -0
- mentat_gulp-1.6.51/tests/integration/test_stress.py +735 -0
- mentat_gulp-1.6.51/tests/integration/test_users.py +223 -0
- mentat_gulp-1.6.51/tests/integration/test_ws_collab_notifications.py +233 -0
- mentat_gulp-1.6.51/tests/integration/test_ws_notifications_wait.py +150 -0
- mentat_gulp-1.6.51/tests/integration/test_ws_user_notifications.py +89 -0
- mentat_gulp-1.6.51/tests/sigma_match_all.yml +14 -0
- mentat_gulp-1.6.51/tests/sigma_windows.zip +0 -0
- mentat_gulp-1.6.51/tests/sigma_windows_small.zip +0 -0
- mentat_gulp-1.6.51/tests/test_ingest_zip.zip +0 -0
- mentat_gulp-1.6.51/tests/unit/test_multi_instance_routing.py +732 -0
- mentat_gulp-1.6.51/tests/unit/test_ws_api.py +178 -0
- mentat_gulp-1.6.51/tests_old/README.md +6 -0
- mentat_gulp-1.6.51/tests_old/__init__.py +0 -0
- mentat_gulp-1.6.51/tests_old/enrich/test_enrich_abuse.py +234 -0
- mentat_gulp-1.6.51/tests_old/enrich/test_enrich_circl_hash.py +207 -0
- mentat_gulp-1.6.51/tests_old/enrich/test_enrich_whois.py +276 -0
- mentat_gulp-1.6.51/tests_old/extension/__init__.py +0 -0
- mentat_gulp-1.6.51/tests_old/extension/test_ai_assistant.py +146 -0
- mentat_gulp-1.6.51/tests_old/ingest/__init__.py +0 -0
- mentat_gulp-1.6.51/tests_old/ingest/raw_chunk.json +38 -0
- mentat_gulp-1.6.51/tests_old/ingest/test_ingest.py +1245 -0
- mentat_gulp-1.6.51/tests_old/ingest/test_ingest_zip.zip +0 -0
- mentat_gulp-1.6.51/tests_old/query/__init__.py +0 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/Microsoft-Windows-Sysmon%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/Microsoft-Windows-Windows Defender%4Operational.evtx +0 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/match_all.yaml +14 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/match_some.yaml +19 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/match_some_more.yaml +18 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/win_defender_threat.yml +25 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/windefend_test.yml +46 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/windows.zip +0 -0
- mentat_gulp-1.6.51/tests_old/query/sigma/windows_small.zip +0 -0
- mentat_gulp-1.6.51/tests_old/query/test_query_api.py +429 -0
- mentat_gulp-1.6.51/tests_old/query/test_query_external_elasticsearch.py +113 -0
- mentat_gulp-1.6.51/tests_old/query/test_query_external_wazuh.py +130 -0
- mentat_gulp-1.6.51/tests_old/smoke_test.sh +104 -0
- mentat_gulp-1.6.51/tests_old/test_db.py +185 -0
- mentat_gulp-1.6.51/tests_old/test_glyph.py +104 -0
- mentat_gulp-1.6.51/tests_old/test_highlight.py +102 -0
- mentat_gulp-1.6.51/tests_old/test_link.py +115 -0
- mentat_gulp-1.6.51/tests_old/test_note.py +363 -0
- mentat_gulp-1.6.51/tests_old/test_operation.py +478 -0
- mentat_gulp-1.6.51/tests_old/test_storage.py +64 -0
- mentat_gulp-1.6.51/tests_old/test_tag_documents.py +159 -0
- mentat_gulp-1.6.51/tests_old/test_user.py +348 -0
- mentat_gulp-1.6.51/tests_old/test_user_group.py +143 -0
- mentat_gulp-1.6.51/tests_old/test_utility.py +142 -0
- mentat_gulp-1.6.51/tests_old/test_ws_client_data.py +120 -0
- mentat_gulp-1.6.51/tests_old/user.png +0 -0
- 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
|
mentat_gulp-1.6.51/.env
ADDED
|
@@ -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,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
|
+
|