Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 45 additions & 15 deletions greenbone/feed/sync/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,19 @@
import os
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Callable, Iterable, Optional, Protocol, Union
from typing import (
Any,
Callable,
Generic,
Iterable,
Optional,
Protocol,
TypeVar,
Union,
)
from urllib.parse import urlsplit

from greenbone.feed.sync.errors import ConfigFileError
from greenbone.feed.sync.errors import ConfigError, ConfigFileError
from greenbone.feed.sync.helper import DEFAULT_FLOCK_WAIT_INTERVAL
from greenbone.feed.sync.rsync import (
DEFAULT_RSYNC_COMPRESSION_LEVEL,
Expand Down Expand Up @@ -56,15 +65,36 @@

DEFAULT_VERBOSITY = 2

T = TypeVar("T")
ValuesDict = dict[str, Any]
DefaultValueCallable = Callable[[ValuesDict], Any]
ValueTypeCallable = Callable[[Any], T]


def resolve_gvmd_data_destination(values: ValuesDict) -> str:
path = "gvm/data-objects/gvmd"
feed_version: str = values.get("feed-version") # type: ignore[assignment]
str_major, str_minor = feed_version.split(".")[:2]
try:
major, minor = int(str_major), int(str_minor)
except ValueError as e:
raise ConfigError(f"Invalid feed version format: {feed_version}") from e

Check warning on line 81 in greenbone/feed/sync/config.py

View check run for this annotation

Codecov / codecov/patch

greenbone/feed/sync/config.py#L80-L81

Added lines #L80 - L81 were not covered by tests

return (
f"{values['destination-prefix']}/{path}"
if major >= 24 and minor >= 10
else f"{values['destination-prefix']}/{path}/{feed_version}"
)


@dataclass
class Setting:
class Setting(Generic[T]):
config_key: str
environment_key: str
default_value: Union[str, int, bool, None]
value_type: Callable
value_type: ValueTypeCallable[T]

def resolve(self, values: dict[str, Any]) -> Any:
def resolve(self, values: ValuesDict) -> Optional[T]:
value: Any
if self.environment_key in os.environ:
value = os.environ.get(self.environment_key)
Expand All @@ -77,13 +107,13 @@


@dataclass
class DependentSetting:
class DependentSetting(Generic[T]):
config_key: str
environment_key: str
default_value: Callable
value_type: Callable
default_value: DefaultValueCallable
value_type: ValueTypeCallable[T]

def resolve(self, values: dict[str, Any]) -> Any:
def resolve(self, values: ValuesDict) -> Optional[T]:
if self.environment_key in os.environ:
value = os.environ.get(self.environment_key)
elif self.config_key in values:
Expand Down Expand Up @@ -160,12 +190,12 @@
),
)

# pylint: disable=line-too-long

_DEPENDENT_SETTINGS = (
DependentSetting(
"gvmd-data-destination",
"GREENBONE_FEED_SYNC_GVMD_DATA_DESTINATION",
lambda values: f"{values['destination-prefix']}/gvm/data-objects/gvmd/{values['feed-version']}/", # noqa: E501
resolve_gvmd_data_destination,
Path,
),
DependentSetting(
Expand Down Expand Up @@ -225,7 +255,7 @@
DependentSetting(
"report-formats-destination",
"GREENBONE_FEED_SYNC_REPORT_FORMATS_DESTINATION",
lambda values: f"{values['destination-prefix']}/gvm/data-objects/gvmd/{values['feed-version']}/report-formats", # noqa: E501
lambda values: f"{values['gvmd-data-destination']}/report-formats",
Path,
),
DependentSetting(
Expand All @@ -237,7 +267,7 @@
DependentSetting(
"scan-configs-destination",
"GREENBONE_FEED_SYNC_SCAN_CONFIGS_DESTINATION",
lambda values: f"{values['destination-prefix']}/gvm/data-objects/gvmd/{values['feed-version']}/scan-configs", # noqa: E501
lambda values: f"{values['gvmd-data-destination']}/scan-configs",
Path,
),
DependentSetting(
Expand All @@ -249,7 +279,7 @@
DependentSetting(
"port-lists-destination",
"GREENBONE_FEED_SYNC_PORT_LISTS_DESTINATION",
lambda values: f"{values['destination-prefix']}/gvm/data-objects/gvmd/{values['feed-version']}/port-lists", # noqa: E501
lambda values: f"{values['gvmd-data-destination']}/port-lists",
Path,
),
DependentSetting(
Expand Down Expand Up @@ -286,7 +316,7 @@
"""

def __init__(self) -> None:
self._config: dict[str, Any] = {}
self._config: ValuesDict = {}

def load_from_config_file(self, config_file: Path) -> None:
try:
Expand Down
8 changes: 7 additions & 1 deletion greenbone/feed/sync/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ class GreenboneFeedSyncError(Exception):
"""


class ConfigFileError(GreenboneFeedSyncError):
class ConfigError(GreenboneFeedSyncError):
"""
Error while processing a config
"""


class ConfigFileError(ConfigError):
"""
Error while processing a config file
"""
Expand Down
23 changes: 5 additions & 18 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,7 @@ def test_defaults(self):
)
self.assertEqual(
values["gvmd-data-destination"],
Path(DEFAULT_DESTINATION_PREFIX)
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION,
Path(DEFAULT_DESTINATION_PREFIX) / "gvm" / "data-objects" / "gvmd",
)
self.assertEqual(
values["gvmd-data-url"],
Expand Down Expand Up @@ -90,7 +86,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "report-formats",
)
self.assertEqual(
Expand All @@ -103,7 +98,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "scan-configs",
)
self.assertEqual(
Expand All @@ -116,7 +110,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "port-lists",
)
self.assertEqual(
Expand Down Expand Up @@ -261,7 +254,7 @@ def test_destination_prefix(self):
self.assertEqual(values["destination-prefix"], Path("/opt/lib"))
self.assertEqual(
values["gvmd-data-destination"],
Path(f"/opt/lib/gvm/data-objects/gvmd/{DEFAULT_FEED_VERSION}"),
Path("/opt/lib/gvm/data-objects/gvmd/"),
)
self.assertEqual(values["notus-destination"], Path("/opt/lib/notus"))
self.assertEqual(
Expand All @@ -275,21 +268,15 @@ def test_destination_prefix(self):
)
self.assertEqual(
values["report-formats-destination"],
Path(
f"/opt/lib/gvm/data-objects/gvmd/{DEFAULT_FEED_VERSION}/report-formats"
),
Path("/opt/lib/gvm/data-objects/gvmd/report-formats"),
)
self.assertEqual(
values["scan-configs-destination"],
Path(
f"/opt/lib/gvm/data-objects/gvmd/{DEFAULT_FEED_VERSION}/scan-configs"
),
Path("/opt/lib/gvm/data-objects/gvmd/scan-configs"),
)
self.assertEqual(
values["port-lists-destination"],
Path(
f"/opt/lib/gvm/data-objects/gvmd/{DEFAULT_FEED_VERSION}/port-lists"
),
Path("/opt/lib/gvm/data-objects/gvmd/port-lists"),
)
self.assertEqual(
values["openvas-lock-file"],
Expand Down
18 changes: 2 additions & 16 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,7 @@ def test_defaults(self):
self.assertEqual(args.feed_url, DEFAULT_RSYNC_URL)
self.assertEqual(
args.gvmd_data_destination,
Path(DEFAULT_DESTINATION_PREFIX)
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION,
Path(DEFAULT_DESTINATION_PREFIX) / "gvm" / "data-objects" / "gvmd",
)
self.assertEqual(
args.gvmd_data_url,
Expand Down Expand Up @@ -158,7 +154,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "report-formats",
)
self.assertEqual(
Expand All @@ -171,7 +166,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "scan-configs",
)
self.assertEqual(
Expand All @@ -184,7 +178,6 @@ def test_defaults(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "port-lists",
)
self.assertEqual(
Expand Down Expand Up @@ -885,11 +878,7 @@ def test_destination_prefix(self):
self.assertEqual(args.destination_prefix, Path(destination_prefix))
self.assertEqual(
args.gvmd_data_destination,
Path(destination_prefix)
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION,
Path(destination_prefix) / "gvm" / "data-objects" / "gvmd",
)
self.assertEqual(
args.notus_destination,
Expand All @@ -913,7 +902,6 @@ def test_destination_prefix(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "report-formats",
)
self.assertEqual(
Expand All @@ -922,7 +910,6 @@ def test_destination_prefix(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "scan-configs",
)
self.assertEqual(
Expand All @@ -931,7 +918,6 @@ def test_destination_prefix(self):
/ "gvm"
/ "data-objects"
/ "gvmd"
/ DEFAULT_FEED_VERSION
/ "port-lists",
)
self.assertEqual(
Expand Down
Loading