Skip to content

Commit c8ba382

Browse files
committed
Implement reporting backend MongoDBReports.summaries
1 parent d2abbe5 commit c8ba382

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

lib/cuckoo/core/reporting/api.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ def iocs(self, task_id: int) -> dict:
5353
def summary(self, task_id: int) -> schema.Summary | None:
5454
raise NotImplementedError()
5555

56-
# TODO(jf) return list/generator of all schema.Summary's known to reporting backends
57-
def summaries(self) -> Generator[schema.Summary]:
56+
def summaries(self) -> Generator[schema.Summary, None, None]:
5857
raise NotImplementedError()
5958

6059
def recent_suricata_alerts(self, minutes=60) -> list:

lib/cuckoo/core/reporting/backends/elasticsearch.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional
1+
from typing import Generator, Optional
22

33
from lib.cuckoo.common import config
44
from lib.cuckoo.core.reporting import api, schema
@@ -92,6 +92,9 @@ def summary(self, task_id: int) -> Optional[schema.Summary]:
9292
else:
9393
return None
9494

95+
def summaries(self) -> Generator[schema.Summary, None, None]:
96+
pass
97+
9598
def recent_suricata_alerts(self, minutes=60) -> list:
9699
pass
97100

lib/cuckoo/core/reporting/backends/mongodb.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import itertools
22
import logging
33
from datetime import datetime, timedelta
4-
from typing import Any, Mapping, Optional, cast, TypeAlias
4+
from typing import Any, Generator, Mapping, Optional, cast, TypeAlias
55
from collections.abc import Iterable
66

77
import pymongo
@@ -150,6 +150,17 @@ def summary(self, task_id: int) -> Optional[schema.Summary]:
150150
return schema.Summary(**report)
151151
return None
152152

153+
def summaries(self) -> Generator[schema.Summary, None, None]:
154+
tasks = self._analysis_collection.find({}, {_id: 0, _info_id: 1})
155+
for task in tasks:
156+
task_id = task.get("info", {}).get("id")
157+
if task_id is None:
158+
continue
159+
if summary := self.summary(task_id):
160+
yield summary
161+
else:
162+
continue
163+
153164
def recent_suricata_alerts(self, minutes=60) -> list:
154165
gen_time = datetime.now() - timedelta(minutes=minutes)
155166
dummy_id = ObjectId.from_datetime(gen_time)

tests/lib/cuckoo/core/reporting/backends/test_mongodb.py

+11
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,17 @@ def test_summary(self):
111111
assert result.vt_url_summary == "20/30"
112112
assert result.clamav == []
113113

114+
@pytest.mark.usefixtures("mongodb_populate_test_data")
115+
def test_summaries(self):
116+
"""Retrieve Summaries from MongoDB."""
117+
mongo = mongodb.MongoDBReports(self.cfg)
118+
results = mongo.summaries()
119+
result_count = 0
120+
for result in results:
121+
result_count += 1
122+
assert isinstance(result, schema.Summary)
123+
assert result_count == len(TEST_TASK_IDS)
124+
114125
@pytest.mark.usefixtures("mongodb_populate_test_data")
115126
def test_cape_configs(self):
116127
"""Retrieve analysis configs from MongoDB."""

0 commit comments

Comments
 (0)