Skip to content

Commit a69782b

Browse files
divolginsquizzi
andauthored
secureos provider (#941)
* secureos provider Signed-off-by: divolgin <[email protected]> * Use VulnerableRange when fixes are applied in different revisions of the same version Signed-off-by: divolgin <[email protected]> * test: add SecureOS provider to quality gate config Signed-off-by: Kyle Squizzato <[email protected]> * test: Only use a subset of fixtures Signed-off-by: Kyle Squizzato <[email protected]> * test: Update commit for vulnerability-match-labels Signed-off-by: Kyle Squizzato <[email protected]> --------- Signed-off-by: divolgin <[email protected]> Signed-off-by: Kyle Squizzato <[email protected]> Co-authored-by: Kyle Squizzato <[email protected]>
1 parent 25d6db4 commit a69782b

27 files changed

+1316
-4
lines changed

src/vunnel/cli/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class Providers:
6262
oracle: providers.oracle.Config = field(default_factory=providers.oracle.Config)
6363
rhel: providers.rhel.Config = field(default_factory=providers.rhel.Config)
6464
rocky: providers.rocky.Config = field(default_factory=providers.rocky.Config)
65+
secureos: providers.secureos.Config = field(default_factory=providers.secureos.Config)
6566
sles: providers.sles.Config = field(default_factory=providers.sles.Config)
6667
ubuntu: providers.ubuntu.Config = field(default_factory=providers.ubuntu.Config)
6768
wolfi: providers.wolfi.Config = field(default_factory=providers.wolfi.Config)

src/vunnel/providers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
oracle,
2525
rhel,
2626
rocky,
27+
secureos,
2728
sles,
2829
ubuntu,
2930
wolfi,
@@ -49,6 +50,7 @@
4950
oracle.Provider.name(): oracle.Provider,
5051
rhel.Provider.name(): rhel.Provider,
5152
rocky.Provider.name(): rocky.Provider,
53+
secureos.Provider.name(): secureos.Provider,
5254
sles.Provider.name(): sles.Provider,
5355
ubuntu.Provider.name(): ubuntu.Provider,
5456
wolfi.Provider.name(): wolfi.Provider,
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from __future__ import annotations
2+
3+
import os
4+
from dataclasses import dataclass, field
5+
from typing import TYPE_CHECKING
6+
7+
from vunnel import provider, result, schema
8+
from vunnel.utils import timer
9+
10+
from .parser import Parser
11+
12+
if TYPE_CHECKING:
13+
import datetime
14+
15+
16+
@dataclass
17+
class Config:
18+
runtime: provider.RuntimeConfig = field(
19+
default_factory=lambda: provider.RuntimeConfig(
20+
result_store=result.StoreStrategy.SQLITE,
21+
existing_results=result.ResultStatePolicy.DELETE_BEFORE_WRITE,
22+
),
23+
)
24+
request_timeout: int = 125
25+
26+
27+
class Provider(provider.Provider):
28+
__schema__ = schema.OSSchema()
29+
__distribution_version__ = int(__schema__.major_version)
30+
31+
_url = "https://security.secureos.io/v1/latest.json"
32+
_namespace = "secureos"
33+
34+
def __init__(self, root: str, config: Config | None = None):
35+
if not config:
36+
config = Config()
37+
super().__init__(root, runtime_cfg=config.runtime)
38+
self.config = config
39+
40+
self.logger.debug(f"config: {config}")
41+
42+
self.parser = Parser(
43+
workspace=self.workspace,
44+
url=self._url,
45+
namespace=self._namespace,
46+
download_timeout=self.config.request_timeout,
47+
logger=self.logger,
48+
)
49+
50+
# this provider requires the previous state from former runs
51+
provider.disallow_existing_input_policy(config.runtime)
52+
53+
@classmethod
54+
def name(cls) -> str:
55+
return "secureos"
56+
57+
def update(self, last_updated: datetime.datetime | None) -> tuple[list[str], int]:
58+
with timer(self.name(), self.logger):
59+
with self.results_writer() as writer, self.parser:
60+
# TODO: tech debt: on subsequent runs, we should only write new vulns (this currently re-writes all)
61+
for release, vuln_dict in self.parser.get():
62+
for vuln_id, record in vuln_dict.items():
63+
writer.write(
64+
identifier=os.path.join(f"{self._namespace.lower()}:{release.lower()}", vuln_id),
65+
schema=self.__schema__,
66+
payload=record,
67+
)
68+
69+
return self.parser.urls, len(writer)

0 commit comments

Comments
 (0)