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(",")}}
+