diff --git a/oxi/models/__init__.py b/oxi/interface/__init__.py similarity index 68% rename from oxi/models/__init__.py rename to oxi/interface/__init__.py index 31364fe..8ce0323 100644 --- a/oxi/models/__init__.py +++ b/oxi/interface/__init__.py @@ -1,9 +1,10 @@ from .vrp import Vrp from .qtech import Qtech from .mikrotik import Mikrotik - +from .bdcom import BDcom __all__ = [ 'Vrp', 'Qtech', - 'Mikrotik' + 'Mikrotik', + 'BDcom' ] diff --git a/oxi/models/base.py b/oxi/interface/base.py similarity index 100% rename from oxi/models/base.py rename to oxi/interface/base.py diff --git a/oxi/interface/bdcom.py b/oxi/interface/bdcom.py new file mode 100644 index 0000000..0b60516 --- /dev/null +++ b/oxi/interface/bdcom.py @@ -0,0 +1,5 @@ +from oxi.interface import Qtech + + +class BDcom(Qtech): + pass diff --git a/oxi/interface/mikrotik.py b/oxi/interface/mikrotik.py new file mode 100644 index 0000000..1ff9197 --- /dev/null +++ b/oxi/interface/mikrotik.py @@ -0,0 +1,5 @@ +from oxi.interface.base import BaseDevice + + +class Mikrotik(BaseDevice): + ... diff --git a/oxi/models/qtech.py b/oxi/interface/qtech.py similarity index 92% rename from oxi/models/qtech.py rename to oxi/interface/qtech.py index 92ec4fb..b8bd351 100644 --- a/oxi/models/qtech.py +++ b/oxi/interface/qtech.py @@ -1,6 +1,6 @@ import re -from oxi.models.base import BaseDevice +from oxi.interface.base import BaseDevice class Qtech(BaseDevice): diff --git a/oxi/models/vrp.py b/oxi/interface/vrp.py similarity index 96% rename from oxi/models/vrp.py rename to oxi/interface/vrp.py index 0667c8e..13bd520 100644 --- a/oxi/models/vrp.py +++ b/oxi/interface/vrp.py @@ -1,6 +1,6 @@ import re -from oxi.models.base import BaseDevice, Vlan +from oxi.interface.base import BaseDevice, Vlan class Vrp(BaseDevice): diff --git a/oxi/manager.py b/oxi/manager.py index a524faf..0f93695 100644 --- a/oxi/manager.py +++ b/oxi/manager.py @@ -1,16 +1,30 @@ +import logging + import requests from typing import Optional + from settings import settings +log = logging.getLogger() -class OxiManager: + +class OxidizedAPI: def __init__( self, - session: Optional[requests.Session] = None + session: Optional[requests.Session] = None, + username: Optional[str] = None, + password: Optional[str] = None, + verify: bool = True ): - self.base_url = settings.oxi_url + self.base_url = settings.oxi_url.rstrip('/') self._session = session or requests.Session() - self._session.auth = (settings.oxi_username, settings.oxi_password) + self._session.verify = verify + if username and password: + self._session.auth = (username, password) + + @property + def node(self): + return Node(self._session, self.base_url) def __enter__(self): return self @@ -18,7 +32,7 @@ class OxiManager: def __exit__(self, *args): self._session.close() - def get(self, endpoint: str, **kwargs) -> requests.Response: + def get(self, endpoint: str, **kwargs) -> dict: url = f"{self.base_url}/{endpoint.lstrip('/')}" if not url.endswith('.json'): url += '.json' @@ -28,6 +42,68 @@ class OxiManager: return result.json() -oxi = OxiManager() -oxi.get('node/show/AKD-MSK30-AGG_S-01') +class Node: + def __init__(self, session: requests.Session, base_url: str): + self._session = session + self._base_url = base_url + self._data = None + def show(self, name: str) -> 'NodeView': + url = f"{self._base_url}/node/show/{name}" + if not url.endswith('.json'): + url += '.json' + self._data = self._session.get(url) + return NodeView( + session=self._session, + base_url=self._base_url, + data=self._data.json() + ) + + +class NodeView: + def __init__(self, session: requests.Session, base_url: str, data: dict): + self._session = session + self._base_url = base_url + self._data = data + + @property + def ip(self): + return self._data.get('ip') + + @property + def full_name(self): + return self._data.get('full_name') + + @property + def group(self): + return self._data.get('group') + + @property + def model(self): + return self._data.get('model') + + @property + def config(self): + return NodeConfig(self._session, self.full_name, self._base_url) + + +class NodeConfig: + def __init__(self, session: requests.Session, full_name: str, base_url: str): + self._session = session + self._full_name = full_name + self._url = f"{base_url}/node/fetch/{full_name}" + + def text(self) -> str: + return self._session.get(self._url).text + + def json(self) -> dict: + return self._session.get(self._url).json() + + def __str__(self) -> str: + return self.text() + + +oxi = OxidizedAPI(username=settings.oxi_username, password=settings.oxi_password, verify=False) +print(oxi.node.show('Novok_HOME').config) +mikrotik = oxi.node.show('Novok_HOME').model +print(mikrotik.model) \ No newline at end of file diff --git a/oxi/models/mikrotik.py b/oxi/models/mikrotik.py deleted file mode 100644 index ac5b820..0000000 --- a/oxi/models/mikrotik.py +++ /dev/null @@ -1,5 +0,0 @@ -from oxi.models.base import BaseDevice - - -class Mikrotik(BaseDevice): - ... diff --git a/pynet.py b/pynet.py index 0388fde..f902572 100644 --- a/pynet.py +++ b/pynet.py @@ -3,19 +3,16 @@ import pynetbox from settings import settings netbox = pynetbox.api( - settings.url, - token=settings.token) + settings.nb_url, + token=settings.nb_token) netbox.http_session.verify = False filters = { - "has_primary_ip": "true", # или True, зависит от API - "tenant": "vimpelcom", # имя или ID арендатора - "role": "Kommutator", # роль устройства + "has_primary_ip": "true", + "tenant": "vimpelcom", + "role": "Kommutator", } -# Передаём словарь в filter через ** devices = netbox.dcim.devices.filter(**filters) - -# Вывод результатов for device in devices: print(f"{device.name} (IP: {device.primary_ip})") \ No newline at end of file diff --git a/type.py b/type.py new file mode 100644 index 0000000..624de3f --- /dev/null +++ b/type.py @@ -0,0 +1,5 @@ +vimpelcomSWType = { + "has_primary_ip": "true", + "tenant": "vimpelcom", + "role": "Kommutator", +} \ No newline at end of file