Skip to content

Commit 8ca89ed

Browse files
committed
[client] Enhance collectors management for security platforms (#31)
1 parent 2af95a7 commit 8ca89ed

File tree

6 files changed

+74
-9
lines changed

6 files changed

+74
-9
lines changed

pyobas/apis/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .me import * # noqa: F401,F403
1010
from .organization import * # noqa: F401,F403
1111
from .payload import * # noqa: F401,F403
12+
from .security_platform import * # noqa: F401,F403
1213
from .team import * # noqa: F401,F403
1314
from .user import * # noqa: F401,F403
1415

pyobas/apis/document.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,13 @@ def download(self, document_id: str, **kwargs: Any) -> Dict[str, Any]:
1717
path = f"{self.path}/" + document_id + "/file"
1818
result = self.openbas.http_get(path, **kwargs)
1919
return result
20+
21+
@exc.on_http_error(exc.OpenBASUpdateError)
22+
def upsert(
23+
self, document: Dict[str, Any], file: tuple, **kwargs: Any
24+
) -> Dict[str, Any]:
25+
path = f"{self.path}/upsert"
26+
result = self.openbas.http_post(
27+
path, post_data=document, files={"file": file}, **kwargs
28+
)
29+
return result

pyobas/apis/security_platform.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Any, Dict
2+
3+
from pyobas import exceptions as exc
4+
from pyobas.base import RESTManager, RESTObject
5+
from pyobas.mixins import CreateMixin, GetMixin, ListMixin, UpdateMixin
6+
from pyobas.utils import RequiredOptional
7+
8+
9+
class SecurityPlatform(RESTObject):
10+
pass
11+
12+
13+
class SecurityPlatformManager(
14+
GetMixin, ListMixin, CreateMixin, UpdateMixin, RESTManager
15+
):
16+
_path = "/security_platforms"
17+
_obj_cls = SecurityPlatform
18+
_create_attrs = RequiredOptional(
19+
required=("asset_name", "security_platform_type"),
20+
optional=(
21+
"asset_description",
22+
"security_platform_logo_light",
23+
"security_platform_logo_dark",
24+
),
25+
)
26+
27+
@exc.on_http_error(exc.OpenBASUpdateError)
28+
def upsert(
29+
self, security_platform: Dict[str, Any], **kwargs: Any
30+
) -> Dict[str, Any]:
31+
path = f"{self.path}/upsert"
32+
result = self.openbas.http_post(path, post_data=security_platform, **kwargs)
33+
return result

pyobas/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def __init__(
6868
self.user = apis.UserManager(self)
6969
self.inject_expectation = apis.InjectExpectationManager(self)
7070
self.payload = apis.PayloadManager(self)
71+
self.security_platform = apis.SecurityPlatformManager(self)
7172

7273
@staticmethod
7374
def _check_redirects(result: requests.Response) -> None:

pyobas/helpers.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -307,28 +307,47 @@ def get_conf(self, variable, is_number=None, default=None, required=None):
307307

308308

309309
class OpenBASCollectorHelper:
310-
def __init__(self, config: OpenBASConfigHelper, icon) -> None:
310+
def __init__(
311+
self, config: OpenBASConfigHelper, icon, security_platform_type=None
312+
) -> None:
311313
self.config_helper = config
312314
self.api = OpenBAS(
313315
url=config.get_conf("openbas_url"),
314316
token=config.get_conf("openbas_token"),
315317
)
316318

317-
self.config = {
318-
"collector_id": config.get_conf("collector_id"),
319-
"collector_name": config.get_conf("collector_name"),
320-
"collector_type": config.get_conf("collector_type"),
321-
"collector_period": config.get_conf("collector_period"),
322-
}
323-
324319
self.logger_class = utils.logger(
325320
config.get_conf("collector_log_level", default="info").upper(),
326321
config.get_conf("collector_json_logging", default=True),
327322
)
328323
self.collector_logger = self.logger_class(config.get_conf("collector_name"))
329324

330325
icon_name = config.get_conf("collector_id") + ".png"
331-
collector_icon = (icon_name, icon, "image/png")
326+
327+
security_platform_id = None
328+
if security_platform_type is not None:
329+
collector_icon = (icon_name, open(icon, "rb"), "image/png")
330+
document = self.api.document.upsert(document={}, file=collector_icon)
331+
security_platform = self.api.security_platform.upsert(
332+
{
333+
"asset_name": config.get_conf("collector_name"),
334+
"asset_external_reference": config.get_conf("collector_id"),
335+
"security_platform_type": security_platform_type,
336+
"security_platform_logo_light": document.get("document_id"),
337+
"security_platform_logo_dark": document.get("document_id"),
338+
}
339+
)
340+
security_platform_id = security_platform.get("asset_id")
341+
342+
self.config = {
343+
"collector_id": config.get_conf("collector_id"),
344+
"collector_name": config.get_conf("collector_name"),
345+
"collector_type": config.get_conf("collector_type"),
346+
"collector_period": config.get_conf("collector_period"),
347+
"collector_security_platform": security_platform_id,
348+
}
349+
350+
collector_icon = (icon_name, open(icon, "rb"), "image/png")
332351
self.api.collector.create(self.config, collector_icon)
333352
self.connect_run_and_terminate = False
334353
# self.api.injector.create(self.config)

pyobas/mixins.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def create(
202202
self._create_attrs.validate_attrs(data=data)
203203
# Handle specific URL for creation
204204
path = kwargs.pop("path", self.path)
205+
205206
if icon:
206207
files = {"icon": icon}
207208
elif icon is False:

0 commit comments

Comments
 (0)