Skip to content

Commit 15d0ad4

Browse files
authored
Merge pull request #167 from PaperMtn/feature/request-helper-implementation
Introduce centralized request helpers for Chronicle APIs
2 parents b2cc298 + 71754d9 commit 15d0ad4

32 files changed

Lines changed: 1868 additions & 1565 deletions

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88

9+
10+
## [0.34.0] - 2026-01-12
11+
### Added
12+
- `as_list` parameter for paginated list methods to streamline API requests and automatically fetch all pages
13+
- Supported methods: `list_watchlists`, `list_curated_rules`, `list_curated_rule_sets`, `list_curated_rule_set_categories`, `list_curated_rule_set_deployments`, `list_featured_content_rules`
14+
- CLI `--as-list` flag for corresponding list commands
15+
16+
### Updated
17+
- Refactored modules to use centralized `chronicle_request` helper function for improved code consistency and maintainability
18+
- Watchlist (`watchlist.py`)
19+
- Curated rule set (`rule_set.py`)
20+
- Investigation (`investigations.py`)
21+
- UDM mapping (`udm_mapping.py`)
22+
- UDM search (`udm_search.py`)
23+
- Validation (`validate.py`)
24+
925
## [0.33.0] - 2026-01-07
1026
### Added
1127
- Support for following investigation methods:

CLI.md

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,9 +676,12 @@ secops parser-extension delete --log-type OKTA --id "1234567890"
676676
List watchlists:
677677

678678
```bash
679-
# List all watchlists
679+
# List all watchlists (returns dict with pagination metadata)
680680
secops watchlist list
681681

682+
# List watchlists as a direct list (fetches all pages automatically)
683+
secops watchlist list --as-list
684+
682685
# List watchlist with pagination
683686
secops watchlist list --page-size 50
684687
```
@@ -829,10 +832,17 @@ The `rule test` command outputs UDM events as pure JSON objects that can be pipe
829832
### Curated Rule Set Management
830833

831834
List all curated rules:
835+
832836
```bash
837+
# List all curated rules (returns dict with pagination metadata)
833838
secops curated-rule rule list
839+
840+
# List curated rules as a direct list
841+
secops curated-rule rule list --as-list
834842
```
843+
835844
Get curated rules:
845+
836846
```bash
837847
# Get rule by UUID
838848
secops curated-rule rule get --id "ur_ttp_GCP_ServiceAPIDisable"
@@ -842,6 +852,7 @@ secops curated-rule rule get --name "GCP Service API Disable"
842852
```
843853

844854
Search for curated rule detections:
855+
845856
```bash
846857
secops curated-rule search-detections \
847858
--rule-id "ur_ttp_GCP_MassSecretDeletion" \
@@ -861,33 +872,54 @@ secops curated-rule search-detections \
861872
```
862873

863874
List all curated rule sets:
875+
864876
```bash
877+
# List all curated rule sets (returns dict with pagination metadata)
865878
secops curated-rule rule-set list
879+
880+
# List curated rule sets as a direct list
881+
secops curated-rule rule-set list --as-list
866882
```
867883

868884
Get specific curated rule set details:
885+
869886
```bash
870887
# Get curated rule set by UUID
871888
secops curated-rule rule-set get --id "f5533b66-9327-9880-93e6-75a738ac2345"
889+
890+
# Get curated rule set by name
891+
secops curated-rule rule-set get --name "Active Breach Priority Host Indicators"
872892
```
873893

874894
List all curated rule set categories:
895+
875896
```bash
897+
# List all curated rule set categories (returns dict with pagination metadata)
876898
secops curated-rule rule-set-category list
899+
900+
# List curated rule set categories as a direct list
901+
secops curated-rule rule-set-category list --as-list
877902
```
878903

879904
Get specific curated rule set category details:
905+
880906
```bash
881907
# Get curated rule set category by UUID
882908
secops curated-rule rule-set-category get --id "db1114d4-569b-5f5d-0fb4-f65aaa766c92"
883909
```
884910

885911
List all curated rule set deployments:
912+
886913
```bash
914+
# List all curated rule set deployments (returns dict with pagination metadata)
887915
secops curated-rule rule-set-deployment list
916+
917+
# List curated rule set deployments as a direct list
918+
secops curated-rule rule-set-deployment list --as-list
888919
```
889920

890921
Get specific curated rule set deployment details:
922+
891923
```bash
892924
# Get curated rule set deployment by UUID
893925
secops curated-rule rule-set-deployment get --id "f5533b66-9327-9880-93e6-75a738ac2345"
@@ -1308,7 +1340,11 @@ Featured content rules are pre-built detection rules available in the Chronicle
13081340
#### List all featured content rules:
13091341
13101342
```bash
1343+
# List all featured content rules (returns dict with pagination metadata)
13111344
secops featured-content-rules list
1345+
1346+
# List featured content rules as a direct list
1347+
secops featured-content-rules list --as-list
13121348
```
13131349
13141350
#### List with pagination:

README.md

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,7 +1854,15 @@ watchlist = chronicle.get_watchlist("acb-123-def")
18541854
List all watchlists:
18551855

18561856
```python
1857+
# List watchlists (returns dict with pagination metadata)
18571858
watchlists = chronicle.list_watchlists()
1859+
for watchlist in watchlists.get("watchlists", []):
1860+
print(f"Watchlist: {watchlist.get('displayName')}")
1861+
1862+
# List watchlists as a direct list (automatically fetches all pages)
1863+
watchlists = chronicle.list_watchlists(as_list=True)
1864+
for watchlist in watchlists:
1865+
print(f"Watchlist: {watchlist.get('displayName')}")
18581866
```
18591867

18601868
## Rule Management
@@ -2164,14 +2172,21 @@ If `tooManyAlerts` is True in the response, consider narrowing your search crite
21642172
Query curated rules:
21652173

21662174
```python
2167-
# List all curated rules
2168-
rules = chronicle.list_curated_rules()
2169-
for rule in rules:
2175+
# List all curated rules (returns dict with pagination metadata)
2176+
result = chronicle.list_curated_rules()
2177+
for rule in result.get("curatedRules", []):
21702178
rule_id = rule.get("name", "").split("/")[-1]
21712179
display_name = rule.get("description")
21722180
description = rule.get("description")
21732181
print(f"Rule: {display_name}, Description: {description}")
21742182

2183+
# List all curated rules as a direct list
2184+
rules = chronicle.list_curated_rules(as_list=True)
2185+
for rule in rules:
2186+
rule_id = rule.get("name", "").split("/")[-1]
2187+
display_name = rule.get("description")
2188+
print(f"Rule: {display_name}")
2189+
21752190
# Get a curated rule
21762191
rule = chronicle.get_curated_rule("ur_ttp_lol_Atbroker")
21772192

@@ -2218,8 +2233,15 @@ if "nextPageToken" in result:
22182233
Query curated rule sets:
22192234

22202235
```python
2221-
# List all curated rule sets
2222-
rule_sets = chronicle.list_curated_rule_sets()
2236+
# List all curated rule sets (returns dict with pagination metadata)
2237+
result = chronicle.list_curated_rule_sets()
2238+
for rule_set in result.get("curatedRuleSets", []):
2239+
rule_set_id = rule_set.get("name", "").split("/")[-1]
2240+
display_name = rule_set.get("displayName")
2241+
print(f"Rule Set: {display_name}, ID: {rule_set_id}")
2242+
2243+
# List all curated rule sets as a direct list
2244+
rule_sets = chronicle.list_curated_rule_sets(as_list=True)
22232245
for rule_set in rule_sets:
22242246
rule_set_id = rule_set.get("name", "").split("/")[-1]
22252247
display_name = rule_set.get("displayName")
@@ -2232,8 +2254,15 @@ rule_set = chronicle.get_curated_rule_set("00ad672e-ebb3-0dd1-2a4d-99bd7c5e5f93"
22322254
Query curated rule set categories:
22332255

22342256
```python
2235-
# List all curated rule set categories
2236-
rule_set_categories = chronicle.list_curated_rule_set_categories()
2257+
# List all curated rule set categories (returns dict with pagination metadata)
2258+
result = chronicle.list_curated_rule_set_categories()
2259+
for rule_set_category in result.get("curatedRuleSetCategories", []):
2260+
rule_set_category_id = rule_set_category.get("name", "").split("/")[-1]
2261+
display_name = rule_set_category.get("displayName")
2262+
print(f"Rule Set Category: {display_name}, ID: {rule_set_category_id}")
2263+
2264+
# List all curated rule set categories as a direct list
2265+
rule_set_categories = chronicle.list_curated_rule_set_categories(as_list=True)
22372266
for rule_set_category in rule_set_categories:
22382267
rule_set_category_id = rule_set_category.get("name", "").split("/")[-1]
22392268
display_name = rule_set_category.get("displayName")
@@ -2246,9 +2275,9 @@ rule_set_category = chronicle.get_curated_rule_set_category("110fa43d-7165-2355-
22462275
Manage curated rule set deployments (turn alerting on or off (either precise or broad) for curated rule sets):
22472276

22482277
```python
2249-
# List all curated rule set deployments
2250-
rule_set_deployments = chronicle.list_curated_rule_set_deployments()
2251-
for rs_deployment in rule_set_deployments:
2278+
# List all curated rule set deployments (returns dict with pagination metadata)
2279+
result = chronicle.list_curated_rule_set_deployments()
2280+
for rs_deployment in result.get("curatedRuleSetDeployments", []):
22522281
rule_set_id = rs_deployment.get("name", "").split("/")[-3]
22532282
category_id = rs_deployment.get("name", "").split("/")[-5]
22542283
deployment_status = rs_deployment.get("name", "").split("/")[-1]
@@ -2262,6 +2291,13 @@ for rs_deployment in rule_set_deployments:
22622291
f"Alerting: {alerting}",
22632292
)
22642293

2294+
# List all curated rule set deployments as a direct list
2295+
rule_set_deployments = chronicle.list_curated_rule_set_deployments(as_list=True)
2296+
for rs_deployment in rule_set_deployments:
2297+
rule_set_id = rs_deployment.get("name", "").split("/")[-3]
2298+
display_name = rs_deployment.get("displayName")
2299+
print(f"Rule Set: {display_name}, ID: {rule_set_id}")
2300+
22652301
# Get curated rule set deployment by ID
22662302
rule_set_deployment = chronicle.get_curated_rule_set_deployment("00ad672e-ebb3-0dd1-2a4d-99bd7c5e5f93")
22672303

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "secops"
7-
version = "0.33.0"
7+
version = "0.34.0"
88
description = "Python SDK for wrapping the Google SecOps API for common use cases"
99
readme = "README.md"
1010
requires-python = ">=3.10"

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ protobuf
88
pylint
99
twine
1010
python-dotenv
11+
requests

0 commit comments

Comments
 (0)