diff --git a/oxi/interfaces/models/eltex.py b/oxi/interfaces/models/eltex.py new file mode 100644 index 0000000..1d9f3de --- /dev/null +++ b/oxi/interfaces/models/eltex.py @@ -0,0 +1,43 @@ +from oxi.interfaces import register_parser +from oxi.interfaces.base import BaseDevice + + +@register_parser("eltex") +class Eltex(BaseDevice): + template = "eltex.ttp" + + def system(self) -> dict: + system = self.raw["system"] + serial_num = self.raw["serial"] + if serial_num: + if len(serial_num) > 1: + serial_num = serial_num[0] + system["serial_number"] = serial_num.get("serial_number") + return system + + def vlans(self) -> list[dict]: + vlans_ttp = self.raw.get("vlans", []) + vlans = [] + named_vlan = set() + for item in vlans_ttp: + if item.get("vlan_id"): + named_vlan.add(item.get("vlan_id")) + vlans.append(item) + else: + ids = item.get("vlan_ids", "") + tail = item.get("vlan_tail") + if tail: + ids = f"{ids},{tail}" + for vid in ids: + vid = vid.strip() + if vid in named_vlan: + continue + vlans.append({"vlan_id": vid}) + return vlans + + +if __name__ == "__main__": + with open("./test6.txt") as file: + data = file.read() + eltex = Eltex(data) + print(eltex.parse()) diff --git a/oxi/interfaces/models/qtech.py b/oxi/interfaces/models/qtech.py index e2e9749..2b6e077 100644 --- a/oxi/interfaces/models/qtech.py +++ b/oxi/interfaces/models/qtech.py @@ -1,4 +1,3 @@ -from ipaddress import ip_interface import os from oxi.interfaces import register_parser from oxi.interfaces.base import BaseDevice diff --git a/oxi/interfaces/models/templates/eltex.ttp b/oxi/interfaces/models/templates/eltex.ttp new file mode 100644 index 0000000..2d8660c --- /dev/null +++ b/oxi/interfaces/models/templates/eltex.ttp @@ -0,0 +1,68 @@ + +Базовый шаблон для нового устройства. Скопируйте этот файл, переименуйте +в <vendor>.ttp и заполните группы под формат конфигурации вашего устройства. + +Обязательные группы: system, interfaces. +Опциональная группа: vlans — добавляйте только если устройство поддерживает VLAN. + +--- Группа system --- +Должна возвращать одиночный словарь с полями: + model (str) — модель устройства + serial_number (str) — серийный номер + version (str) — версия прошивки + +--- Группа interfaces --- +Должна возвращать список словарей. Каждый элемент: + interface (str) — имя интерфейса (alias поля name) + ip_address (str|None) — IPv4-адрес + mask (int|None) — длина префикса (напр. 24) + description (str|None) — описание интерфейса + + Если устройство возвращает маску в виде 255.255.255.0, конвертируйте + её в prefix length в методе interfaces() класса устройства. + +--- Группа vlans --- +Должна возвращать список словарей. Каждый элемент: + id (int) — номер VLAN (alias поля vlan_id) + description (str|None) — название VLAN (alias поля name) + +--- Полезные модификаторы TTP --- + {{ field | ORPHRASE }} — одно слово или фраза до конца строки + {{ field | _start_ }} — начало новой записи группы + {{ field | strip('"') }} — убрать кавычки + {{ field | replace("yes","True") }} — замена подстроки + {{ field | exclude("pattern") }} — пропустить строку при совпадении + {{ ignore }} — захватить и выбросить значение + {{ ignore('.*') }} — выбросить всё до конца строки + +Подробнее: docs/templates.md + + +default_system = { + "model": "", + "serial_number": "", + "version": "" +} + + + +Active-image: {{ ignore }} {{ _start_ }} +! Version: {{ version }} + + +! Unit MAC address Hardware version Serial number +! {{ unit | exclude("-") }} {{ mac_address }} {{ hardware_version }} {{ serial_number }} + + + +interface {{ interface | ORPHRASE }} + ip address {{ ip_address }} {{ mask | to_cidr }} + + + +interface vlan {{ vlan_id | _start_ }} + name {{ name }} + +vlan {{ _db_ | _start_ }} + vlan {{ vlan_ids | joinmatches(',') | unrange("-", ",") | split(",")}} +