Implement Keenetic model and enhance BaseDevice documentation

- Added a new `Keenetic` model that registers a parser for KeeneticOS, extending the `BaseDevice` class.
- Updated docstrings in the `BaseDevice` class methods to provide clearer descriptions of their functionality and expected data structures.
- Introduced `model_config` in the `Vlans` model to enable name-based population.
- Removed unnecessary print statements from the `Mikrotik` model methods to streamline output.
"""
This commit is contained in:
IluaAir
2026-02-19 00:49:10 +03:00
parent a938fe2d47
commit a41cb1f7ec
4 changed files with 28 additions and 7 deletions

View File

@@ -28,7 +28,7 @@ class BaseDevice(ABC):
@abstractmethod @abstractmethod
def vlans(self) -> list["Vlans"]: def vlans(self) -> list["Vlans"]:
f""" """
Parse VLAN configuration from self._raw['vlans']. Parse VLAN configuration from self._raw['vlans'].
Expected raw structure: Expected raw structure:
@@ -45,7 +45,7 @@ class BaseDevice(ABC):
@abstractmethod @abstractmethod
def interfaces(self) -> list["Interfaces"]: def interfaces(self) -> list["Interfaces"]:
f""" """
Parse Interface configuration from self._raw['interfaces']. Parse Interface configuration from self._raw['interfaces'].
Expected raw structure: Expected raw structure:
@@ -70,6 +70,7 @@ class BaseDevice(ABC):
... ...
def _load_template(self): def _load_template(self):
"""Подгрузка темплейтов из папки models/templates"""
path = Path(__file__).parent / "models" / "templates" / self.template path = Path(__file__).parent / "models" / "templates" / self.template
if not path.exists(): if not path.exists():
print("-" * 12) print("-" * 12)
@@ -96,6 +97,7 @@ class BaseDevice(ABC):
) )
def _run_ttp(self) -> dict: def _run_ttp(self) -> dict:
""" Основной парсер """
p = ttp(data=self.config, template=self._loaded_template) p = ttp(data=self.config, template=self._loaded_template)
p.parse() p.parse()
raw: dict = p.result()[0][0] raw: dict = p.result()[0][0]

View File

@@ -1,5 +1,5 @@
from ipaddress import IPv4Address from ipaddress import IPv4Address
from pydantic import BaseModel, Field from pydantic import BaseModel, ConfigDict, Field
class Interfaces(BaseModel): class Interfaces(BaseModel):
@@ -16,6 +16,8 @@ class System(BaseModel):
class Vlans(BaseModel): class Vlans(BaseModel):
model_config = ConfigDict(populate_by_name=True)
vlan_id: int vlan_id: int
name: str | None = Field(default=None, alias="description") name: str | None = Field(default=None, alias="description")

View File

@@ -0,0 +1,20 @@
from oxi.interfaces import register_parser
from oxi.interfaces.base import BaseDevice
@register_parser(["NDMS", "keenetic", "KeeneticOS"])
class Keenetic(BaseDevice):
template = "keenetic.ttp"
def system(self): ...
def interfaces(self): ...
def vlans(self): ...
if __name__ == "__main__":
with open("../../test2.txt") as file:
data = file.read()
mikr = Keenetic(data)
print(mikr.parse().json())

View File

@@ -12,11 +12,9 @@ class Mikrotik(BaseDevice):
return System(**systems) return System(**systems)
def interfaces(self) -> "Interfaces": def interfaces(self) -> "Interfaces":
print(self._raw.get("interfaces"))
return [Interfaces(**item) for item in self._raw.get("interfaces")] return [Interfaces(**item) for item in self._raw.get("interfaces")]
def vlans(self) -> list["Vlans"]: def vlans(self) -> list["Vlans"]:
print(self._raw.get("vlans"))
return [Vlans(**item) for item in self._raw.get("vlans")] return [Vlans(**item) for item in self._raw.get("vlans")]
@@ -24,5 +22,4 @@ if __name__ == "__main__":
with open("../../test.txt") as file: with open("../../test.txt") as file:
data = file.read() data = file.read()
mikr = Mikrotik(data) mikr = Mikrotik(data)
mikr.parse() print(mikr.parse().json())
print(mikr)