diff --git a/oxi/interfaces/models/h3c.py b/oxi/interfaces/models/h3c.py new file mode 100644 index 0000000..f97b209 --- /dev/null +++ b/oxi/interfaces/models/h3c.py @@ -0,0 +1,22 @@ +from oxi.interfaces import BaseDevice, register_parser + + +@register_parser("h3c") +class H3C(BaseDevice): + template = "h3c.ttp" + + def vlans(self) -> list[dict]: + vlan_list = self.raw["vlans"] + vlans = [] + for item in vlan_list: + if item.get("vlans_id"): + vlans.extend([{'vlan_id': vln }for vln in item.get("vlans_id")]) + else: + vlans.append(item) + return vlans + +if __name__ == "__main__": + with open("./test5.txt") as file: + data = file.read() + h3c = H3C(data) + print(h3c.parse()) \ No newline at end of file diff --git a/oxi/interfaces/models/templates/h3c.ttp b/oxi/interfaces/models/templates/h3c.ttp new file mode 100644 index 0000000..8c3abe6 --- /dev/null +++ b/oxi/interfaces/models/templates/h3c.ttp @@ -0,0 +1,66 @@ + +Базовый шаблон для нового устройства. Скопируйте этот файл, переименуйте +в <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": "" +} + + + +# Boot image version: {{ version }}, Release {{ release }} +# {{ mpu }} Slot {{ slot }}: +# BOARD TYPE: {{ model }} + + + +interface {{ interface }} + ip address {{ ip_address }} {{ mask | to_cidr }} + + + +vlan {{ vlan_id }} + name {{ name }} + description {{ description }} + + +vlan {{ vlans_id | ORPHRASE | contains(" to ") | unrange(" to ", ",") | split(",") }} + \ No newline at end of file