Add Eltex model and TTP template

- Introduced a new `Eltex` model for parsing Eltex devices.
- Created a corresponding TTP template for Eltex devices, defining required and optional groups for configuration parsing.
This commit is contained in:
IluaAir
2026-03-04 15:50:47 +03:00
parent 1e84452eb5
commit c9f6f3472f
3 changed files with 111 additions and 1 deletions

View File

@@ -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())

View File

@@ -1,4 +1,3 @@
from ipaddress import ip_interface
import os
from oxi.interfaces import register_parser
from oxi.interfaces.base import BaseDevice

View File

@@ -0,0 +1,68 @@
<doc>
Базовый шаблон для нового устройства. Скопируйте этот файл, переименуйте
в &lt;vendor&gt;.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
</doc>
<vars>
default_system = {
"model": "",
"serial_number": "",
"version": ""
}
</vars>
<group name="system" default="default_system">
Active-image: {{ ignore }} {{ _start_ }}
! Version: {{ version }}
</group>
<group name="serial" method="table">
! Unit MAC address Hardware version Serial number
! {{ unit | exclude("-") }} {{ mac_address }} {{ hardware_version }} {{ serial_number }}
</group>
<group name="interfaces">
interface {{ interface | ORPHRASE }}
ip address {{ ip_address }} {{ mask | to_cidr }}
</group>
<group name="vlans">
interface vlan {{ vlan_id | _start_ }}
name {{ name }}
vlan {{ _db_ | _start_ }}
vlan {{ vlan_ids | joinmatches(',') | unrange("-", ",") | split(",")}}
</group>