mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
catch manual validation
This commit is contained in:
@@ -46,6 +46,7 @@ from ..plugins.msd import get_msd_class
|
||||
from ..plugins.ugpio import get_ugpio_driver_class
|
||||
|
||||
from ..yamlconf import ConfigError
|
||||
from ..yamlconf import manual_validated
|
||||
from ..yamlconf import make_config
|
||||
from ..yamlconf import Section
|
||||
from ..yamlconf import Option
|
||||
@@ -185,7 +186,8 @@ def _patch_dynamic( # pylint: disable=too-many-locals
|
||||
"__gpio__": {},
|
||||
**tools.rget(raw_config, "kvmd", "gpio", "drivers"),
|
||||
}.items():
|
||||
driver = valid_ugpio_driver(driver)
|
||||
with manual_validated(driver, "kvmd", "gpio", "drivers", "<key>"):
|
||||
driver = valid_ugpio_driver(driver)
|
||||
driver_type = valid_stripped_string_not_empty(params.get("type", "gpio"))
|
||||
scheme["kvmd"]["gpio"]["drivers"][driver] = {
|
||||
"type": Option(driver_type, type=valid_stripped_string_not_empty),
|
||||
@@ -194,8 +196,10 @@ def _patch_dynamic( # pylint: disable=too-many-locals
|
||||
drivers.add(driver)
|
||||
|
||||
for (channel, params) in tools.rget(raw_config, "kvmd", "gpio", "scheme").items():
|
||||
channel = valid_ugpio_channel(channel)
|
||||
mode = valid_ugpio_mode(params.get("mode", ""))
|
||||
with manual_validated(channel, "kvmd", "gpio", "scheme", "<key>"):
|
||||
channel = valid_ugpio_channel(channel)
|
||||
with manual_validated(params.get("mode", ""), "kvmd", "gpio", "scheme", channel, "mode"):
|
||||
mode = valid_ugpio_mode(params.get("mode", ""))
|
||||
scheme["kvmd"]["gpio"]["scheme"][channel] = {
|
||||
"driver": Option("__gpio__", type=(lambda arg: valid_ugpio_driver(arg, drivers))),
|
||||
"pin": Option(-1, type=valid_gpio_pin),
|
||||
|
||||
@@ -20,11 +20,13 @@
|
||||
# ========================================================================== #
|
||||
|
||||
|
||||
import contextlib
|
||||
import json
|
||||
|
||||
from typing import Tuple
|
||||
from typing import List
|
||||
from typing import Dict
|
||||
from typing import Generator
|
||||
from typing import Callable
|
||||
from typing import Optional
|
||||
from typing import Any
|
||||
@@ -129,6 +131,14 @@ class Option:
|
||||
|
||||
|
||||
# =====
|
||||
@contextlib.contextmanager
|
||||
def manual_validated(value: Any, *path: str) -> Generator[None, None, None]:
|
||||
try:
|
||||
yield
|
||||
except (TypeError, ValueError) as err:
|
||||
raise ConfigError(f"Invalid value {value!r} for key {'/'.join(path)!r}: {err}")
|
||||
|
||||
|
||||
def make_config(raw: Dict[str, Any], scheme: Dict[str, Any], _keys: Tuple[str, ...]=()) -> Section:
|
||||
if not isinstance(raw, dict):
|
||||
raise ConfigError(f"The node {('/'.join(_keys) or '/')!r} must be a dictionary")
|
||||
|
||||
Reference in New Issue
Block a user