gulp-cli 1.1.1__tar.gz → 1.1.3__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 (55) hide show
  1. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/.github/workflows/portable-bundles.yml +53 -1
  2. {gulp_cli-1.1.1/src/gulp_cli.egg-info → gulp_cli-1.1.3}/PKG-INFO +2 -2
  3. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/README.md +1 -1
  4. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/command-reference.md +6 -1
  5. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/examples.md +5 -5
  6. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/getting-started.md +9 -2
  7. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/portable.md +37 -0
  8. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/_version.py +3 -3
  9. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/ingest.py +653 -51
  10. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/stats.py +218 -43
  11. {gulp_cli-1.1.1 → gulp_cli-1.1.3/src/gulp_cli.egg-info}/PKG-INFO +2 -2
  12. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/.github/workflows/python-package.yml +0 -0
  13. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/.gitignore +0 -0
  14. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/extensions.md +0 -0
  15. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/resource-management.md +0 -0
  16. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/docs/troubleshooting-cli.md +0 -0
  17. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/gulp-cli.spec +0 -0
  18. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/portable/launch-linux.sh +0 -0
  19. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/portable/launch-macos.sh +0 -0
  20. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/portable/launch-windows.bat +0 -0
  21. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/pyproject.toml +0 -0
  22. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/setup.cfg +0 -0
  23. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/__init__.py +0 -0
  24. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/__main__.py +0 -0
  25. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/cli.py +0 -0
  26. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/client.py +0 -0
  27. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/__init__.py +0 -0
  28. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/acl.py +0 -0
  29. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/auth.py +0 -0
  30. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/collab.py +0 -0
  31. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/context.py +0 -0
  32. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/db.py +0 -0
  33. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/enhance_map.py +0 -0
  34. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/glyph.py +0 -0
  35. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/mapping.py +0 -0
  36. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/operations.py +0 -0
  37. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/plugin.py +0 -0
  38. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/query.py +0 -0
  39. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/source.py +0 -0
  40. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/storage.py +0 -0
  41. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/user_group.py +0 -0
  42. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/commands/users.py +0 -0
  43. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/config.py +0 -0
  44. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/extension/__init__.py +0 -0
  45. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/extension/query_sigma_zip.py +0 -0
  46. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/extension/story.py +0 -0
  47. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/extension_helpers.py +0 -0
  48. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/extensions.py +0 -0
  49. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/output.py +0 -0
  50. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli/utils.py +0 -0
  51. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli.egg-info/SOURCES.txt +0 -0
  52. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli.egg-info/dependency_links.txt +0 -0
  53. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli.egg-info/entry_points.txt +0 -0
  54. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli.egg-info/requires.txt +0 -0
  55. {gulp_cli-1.1.1 → gulp_cli-1.1.3}/src/gulp_cli.egg-info/top_level.txt +0 -0
@@ -3,8 +3,13 @@ name: Portable bundles
3
3
  "on":
4
4
  push:
5
5
  tags: ['v*', 'test-v*']
6
+ release:
7
+ types: [published]
6
8
  workflow_dispatch: {}
7
9
 
10
+ permissions:
11
+ contents: write
12
+
8
13
  jobs:
9
14
  build-portable:
10
15
  name: Build portable bundle (${{ matrix.bundle_name }})
@@ -72,9 +77,33 @@ jobs:
72
77
  path: dist/${{ matrix.bundle_name }}
73
78
  if-no-files-found: error
74
79
 
80
+ - name: Create release archive
81
+ shell: python
82
+ env:
83
+ BUNDLE_NAME: ${{ matrix.bundle_name }}
84
+ run: |
85
+ import os
86
+ import shutil
87
+ from pathlib import Path
88
+
89
+ dist_dir = Path("dist")
90
+ bundle_name = os.environ["BUNDLE_NAME"]
91
+ bundle_dir = dist_dir / bundle_name
92
+ archive_base = dist_dir / bundle_name
93
+ shutil.make_archive(str(archive_base), "zip", root_dir=bundle_dir.parent, base_dir=bundle_dir.name)
94
+
95
+ - name: Upload release asset
96
+ if: github.event_name == 'release'
97
+ uses: softprops/action-gh-release@v2
98
+ with:
99
+ tag_name: ${{ github.event.release.tag_name }}
100
+ files: dist/${{ matrix.bundle_name }}.zip
101
+ fail_on_unmatched_files: true
102
+
75
103
  build-portable-macos-x64:
76
104
  name: Build portable bundle (gulp-cli-portable-macos-x64)
77
- if: github.event_name == 'workflow_dispatch'
105
+ if: github.event_name == 'workflow_dispatch' || github.event_name == 'release'
106
+ continue-on-error: ${{ github.event_name == 'release' }}
78
107
  runs-on: macos-15-intel
79
108
  timeout-minutes: 90
80
109
 
@@ -125,3 +154,26 @@ jobs:
125
154
  name: gulp-cli-portable-macos-x64
126
155
  path: dist/gulp-cli-portable-macos-x64
127
156
  if-no-files-found: error
157
+
158
+ - name: Create release archive
159
+ shell: python
160
+ env:
161
+ BUNDLE_NAME: gulp-cli-portable-macos-x64
162
+ run: |
163
+ import os
164
+ import shutil
165
+ from pathlib import Path
166
+
167
+ dist_dir = Path("dist")
168
+ bundle_name = os.environ["BUNDLE_NAME"]
169
+ bundle_dir = dist_dir / bundle_name
170
+ archive_base = dist_dir / bundle_name
171
+ shutil.make_archive(str(archive_base), "zip", root_dir=bundle_dir.parent, base_dir=bundle_dir.name)
172
+
173
+ - name: Upload release asset
174
+ if: github.event_name == 'release'
175
+ uses: softprops/action-gh-release@v2
176
+ with:
177
+ tag_name: ${{ github.event.release.tag_name }}
178
+ files: dist/gulp-cli-portable-macos-x64.zip
179
+ fail_on_unmatched_files: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gulp-cli
3
- Version: 1.1.1
3
+ Version: 1.1.3
4
4
  Summary: Command-line client for gULP
5
5
  Author-email: Mentat <info@mentat.is>
6
6
  Requires-Python: >=3.12
@@ -80,7 +80,7 @@ gulp-cli auth whoami
80
80
  # List operations
81
81
  gulp-cli operation list
82
82
 
83
- # Ingest files with wildcard
83
+ # Ingest files with wildcard (per-file progress is on by default; use --no-show-per-file-progress to hide it)
84
84
  gulp-cli ingest file my_operation win_evtx 'samples/win_evtx/*.evtx'
85
85
 
86
86
  # Query documents
@@ -66,7 +66,7 @@ gulp-cli auth whoami
66
66
  # List operations
67
67
  gulp-cli operation list
68
68
 
69
- # Ingest files with wildcard
69
+ # Ingest files with wildcard (per-file progress is on by default; use --no-show-per-file-progress to hide it)
70
70
  gulp-cli ingest file my_operation win_evtx 'samples/win_evtx/*.evtx'
71
71
 
72
72
  # Query documents
@@ -455,7 +455,9 @@ gulp-cli ingest file OPERATION_ID PLUGIN FILE [FILE...] [OPTIONS]
455
455
  - `--create-operation` — Create operation automatically when it does not exist
456
456
  - `--preview` — Run preview-only ingestion (no persistence)
457
457
  - `--wait` — Wait for completion with progress
458
+ - `--show-per-file-progress / --no-show-per-file-progress` — Show one line per completed file request in `--wait` mode (default: on)
458
459
  - `--timeout INTEGER` — Timeout in seconds for `--wait` mode
460
+ - `--batch-size INTEGER` — Number of file ingestion requests to submit concurrently per window (default: `cores * 2`)
459
461
 
460
462
  **Examples:**
461
463
 
@@ -481,7 +483,7 @@ gulp-cli ingest file my_op win_evtx /path/to/System.evtx --preview
481
483
  # Reset operation data before ingest (destructive for collab/request data)
482
484
  gulp-cli ingest file my_op win_evtx 'samples/win_evtx/*.evtx' --reset-operation
483
485
 
484
- # Wait for completion
486
+ # Wait for completion (per-file progress is enabled by default)
485
487
  gulp-cli ingest file my_op win_evtx 'samples/win_evtx/*.evtx' --wait
486
488
  ```
487
489
 
@@ -505,7 +507,9 @@ gulp-cli ingest file-to-source SOURCE_ID FILE [FILE...] [OPTIONS]
505
507
  - `--plugin-params TEXT` — JSON object for plugin_params (overrides source defaults)
506
508
  - `--flt TEXT` — JSON object for GulpIngestionFilter
507
509
  - `--wait` — Wait for completion with progress
510
+ - `--show-per-file-progress / --no-show-per-file-progress` — Show one line per completed file request in `--wait` mode (default: on)
508
511
  - `--timeout INTEGER` — Timeout in seconds for `--wait` mode
512
+ - `--batch-size INTEGER` — Number of file ingestion requests to submit concurrently per window (default: `cores * 2`)
509
513
 
510
514
  **Examples:**
511
515
 
@@ -1017,6 +1021,7 @@ gulp-cli stats list OPERATION_ID [OPTIONS]
1017
1021
  - Shows only ongoing stats (`--ongoing-only` enabled)
1018
1022
  - Renders a live table (`--live` enabled)
1019
1023
  - Default columns: `user_id`, `ws_id`, `req_id`, `status`, `req_type`, `time_updated`, `data`, `errors`
1024
+ - The `data` column shows human-readable source information for ingest stats when available
1020
1025
 
1021
1026
  **Options:**
1022
1027
 
@@ -142,10 +142,10 @@ cap --plugin-params '{ "mapping_parameters": { "mapping_file": "pcap.json" } }'
142
142
  ### Bulk File Ingestion with Wildcard
143
143
 
144
144
  ```bash
145
- # Ingest all .evtx files from directory
145
+ # Ingest all .evtx files from directory (default batch size is `cores * 2`)
146
146
  gulp-cli ingest file incident-001 win_evtx '/evidence/**/*.evtx'
147
147
 
148
- # Ingest from multiple locations
148
+ # Ingest from multiple locations (files are processed in alphabetical order)
149
149
  gulp-cli ingest file incident-001 win_evtx '/suspect-machine/*.evtx' '/network-share/backups/*.evtx'
150
150
 
151
151
  # Preview parser output without ingesting
@@ -158,7 +158,7 @@ gulp-cli ingest file incident-001 win_evtx '/suspect-machine/System.evtx' --prev
158
158
  # Create operation for multi-source investigation
159
159
  gulp-cli operation create incident-2026-001
160
160
 
161
- # Ingest evidence from different sources concurrently
161
+ # Ingest evidence from different sources concurrently (per-file progress is shown by default)
162
162
  gulp-cli ingest file incident-2026-001 win_evtx '/forensic/windows/*.evtx' --wait &
163
163
  gulp-cli ingest file incident-2026-001 syslog '/forensic/linux/**/*.log' --wait &
164
164
  gulp-cli ingest file incident-2026-001 pcap '/forensic/network/*.pcap' --wait &
@@ -195,10 +195,10 @@ gulp-cli ingest file incident-001 json '/logs/**/*.json' --create-operation
195
195
  ### Add More Evidence to Existing Source
196
196
 
197
197
  ```bash
198
- # First ingestion creates data-2026-001 source
198
+ # First ingestion creates data-2026-001 source (default batch size is `cores * 2`)
199
199
  gulp-cli ingest file incident-001 win_evtx /initial/evidence.evtx
200
200
 
201
- # Later, add more files to same source
201
+ # Later, add more files to same source (per-file progress is shown by default)
202
202
  gulp-cli ingest file-to-source data-2026-001 /additional/evidence.evtx --wait
203
203
 
204
204
  # You can also ingest multiple files via glob
@@ -44,11 +44,13 @@ gulp-cli auth login --url http://localhost:8080 --username admin --password admi
44
44
  ```
45
45
 
46
46
  This:
47
+
47
48
  - Connects to your gULP instance
48
49
  - Exchanges credentials for a token
49
50
  - Stores the session in `~/.config/gulp-cli/config.json`
50
51
 
51
52
  **Output should be:**
53
+
52
54
  ```
53
55
  ✓ Authentication successful
54
56
  Token stored in ~/.config/gulp-cli/config.json
@@ -61,6 +63,7 @@ gulp-cli auth whoami
61
63
  ```
62
64
 
63
65
  **Expected output:**
66
+
64
67
  ```
65
68
  ├─ User: admin
66
69
  ├─ Permissions: admin
@@ -102,6 +105,7 @@ gulp-cli operation list
102
105
  ```
103
106
 
104
107
  **Expected output:**
108
+
105
109
  ```
106
110
  ╭────────────────────────────────────────────────────╮
107
111
  │ OPERATIONS │
@@ -121,6 +125,7 @@ gulp-cli operation create my_investigation --description "Investigation into inc
121
125
  ```
122
126
 
123
127
  **Expected output:**
128
+
124
129
  ```
125
130
  ✓ Operation created successfully
126
131
  ID: my_investigation
@@ -165,6 +170,7 @@ gulp-cli ingest file my_investigation win_evtx /gulp/samples/win_evtx/System.evt
165
170
  ```
166
171
 
167
172
  **Expected output:**
173
+
168
174
  ```
169
175
  📥 Ingesting files...
170
176
  ✓ /gulp/samples/win_evtx/System.evtx
@@ -177,7 +183,7 @@ Documents queued for processing
177
183
  gulp-cli ingest file my_investigation win_evtx '/gulp/samples/win_evtx/*.evtx'
178
184
  ```
179
185
 
180
- This ingests all `.evtx` files concurrently.
186
+ This ingests all `.evtx` files using the default batch size (`cores * 2`) and shows per-file progress by default.
181
187
 
182
188
  ### Preview Before Ingest
183
189
 
@@ -193,7 +199,7 @@ This runs parser preview without persisting documents.
193
199
  gulp-cli ingest file my_investigation win_evtx '/gulp/samples/win_evtx/*.evtx' --wait
194
200
  ```
195
201
 
196
- This shows a real-time progress bar while documents are being ingested.
202
+ This shows a real-time progress bar while documents are being ingested. Per-file progress is enabled by default; use `--no-show-per-file-progress` to suppress the per-file lines.
197
203
 
198
204
  ### Add Data to Existing Source
199
205
 
@@ -234,6 +240,7 @@ gulp-cli query raw my_investigation --q '{"query":{"match_all":{}}}'
234
240
  ```
235
241
 
236
242
  **Expected output:**
243
+
237
244
  ```
238
245
  ╭────────────────────────────────────────────────────────╮
239
246
  │ QUERY RESULTS │
@@ -74,3 +74,40 @@ The repository includes a matrix workflow that builds portable artifacts for:
74
74
  - macOS `arm64`
75
75
 
76
76
  Artifacts are uploaded from `.github/workflows/portable-bundles.yml`.
77
+
78
+ ## practical usage examples
79
+
80
+ following are some practical usage examples of the portable bundles
81
+
82
+ ### ingesting windows evtx files taken from a windows machine and ingesting them on a linux machine
83
+
84
+ #### step 1: take windows evtx files from a windows machine
85
+
86
+ 1. Unzip the portable bundle on a USB stick and plug it into the windows machine
87
+ 2. Open a command prompt and navigate to the gulp-cli portable bundle on the USB stick
88
+ 3. Run the following command to generate the zip with evtx files
89
+ ~~~bash
90
+ D:\> cd \path\to\gulp-cli-portable-windows-x64
91
+
92
+ D:\path\to\gulp-cli-portable-windows-x64> .\launch-windows.bat ingest zip-create ./evtx.zip C:\Windows\System32\winevt\Logs\
93
+ ~~~
94
+
95
+ #### step 2: ingest the evtx files on a linux machine
96
+
97
+ > we assume the linux machine have gulp-cli installed and configured to connect to the gULP server, and the user have permissions to ingest data to the gULP server.
98
+
99
+ 1. Go on the linux machine (which can connect to the gULP server) and plug in the USB stick with the portable bundle from above
100
+ 2. Open a terminal and navigate to the gulp-cli portable bundle on the USB stick
101
+ 3. Unzip the evtx.zip file to a local directory
102
+ ~~~bash
103
+ $ cd /path/to/gulp-cli-portable-windows-x64
104
+ $ unzip evtx.zip
105
+ # you obtain a `Logs` directory with the evtx files
106
+ ~~~
107
+ 4. Run the following commands to ingest the evtx files to the gULP server
108
+ ~~~bash
109
+ # authenticate to the gULP server (if not already authenticated)
110
+ gulp-cli auth login --url http://localhost:8080 --username admin --password admin
111
+ # ingest the evtx files to the gULP server, we assume a `test_operation` exists on the gULP server, and we want to ingest the evtx files to that operation
112
+ gulp-cli ingest file test_operation win_evtx ./Logs/*.evtx --wait --batch-size 64
113
+ ~~~
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.1.1'
22
- __version_tuple__ = version_tuple = (1, 1, 1)
21
+ __version__ = version = '1.1.3'
22
+ __version_tuple__ = version_tuple = (1, 1, 3)
23
23
 
24
- __commit_id__ = commit_id = 'g6ee1d9a2a'
24
+ __commit_id__ = commit_id = 'gb7959a376'