API de OLT
El router controla sus OLT mediante el driver de fabricante licenciado que se entrega con él. Esta página cubre:
- Operaciones —
POST /olt/{op}: una operación en una OLT (leer su estado, agregar una ONT, etiquetar una VLAN, …). - El registro —
/olts: las OLT que este router conoce por nombre, con sus credenciales selladas en el router. - Sincronización de planes —
/olt/sync: los planes del router enviados a cada OLT registrada como perfiles y tablas de velocidad. - Respaldos —
/olt/backup,/olt/backups,/olt/diff: el historial de configuración de las OLT.
La URL base, la autenticación (X-API-Key), el formato de errores y la API de acciones se describen en la
descripción general de la API.
Elección de la OLT
Sección titulada «Elección de la OLT»Toda operación necesita una OLT. El router la elige en este orden:
olten el cuerpo (o el encabezadoX-OLT-Name) — una OLT registrada, por nombre. Un nombre desconocido da404.host,user,passen el cuerpo (o los encabezadosX-OLT-Host,X-OLT-User,X-OLT-Pass), conprotocolopcional (telnetossh, por defectotelnet; encabezadoX-OLT-Protocol) yport(el puerto TCP de la OLT; encabezadoX-OLT-Port).passwordse acepta como alias depass.- Nada — cuando hay exactamente una OLT registrada, esa.
En cualquier otro caso la respuesta es 400 (“name a registered OLT (olt) or send host, user and pass on this call”: indique una OLT registrada (olt) o envíe host, user y pass en esta llamada).
Un port numérico en el cuerpo es el puerto TCP de la OLT; un puerto PON como "0/1/3" en port es un
argumento de la operación. pon se acepta como alias del puerto PON.
Opciones comunes y la respuesta
Sección titulada «Opciones comunes y la respuesta»| Nombre | En | Tipo | Notas |
|---|---|---|---|
olt |
body | string | El nombre de una OLT registrada (vea arriba). |
host, user, pass |
body | string | Credenciales de uso único en lugar de olt. |
protocol |
body | string | telnet (por defecto) o ssh. |
vendor |
body | string | Fabricante del driver para credenciales de uso único; por defecto huawei. Una OLT registrada usa el suyo. |
timeout |
body | integer | Segundos, 10–300. Por defecto 40; 180 para config, plan-sync e init. |
raw |
body | boolean | Devuelve además cada comando enviado y la respuesta de la OLT (raw). Siempre se incluye en caso de fallo. |
dry_run |
body | boolean | Las operaciones de escritura que lo admiten solo planifican el cambio y devuelven lo que harían. |
force |
body | boolean | Anula una protección cuando la operación lo permite (vea OLT compartidas). |
Toda operación responde con el mismo sobre:
{ "ok": true, "code": 200, "op": "info", "olt": { "host": "XXX.XXX.XXX.10", "name": "olt-1" }, "took_ms": 1790, "result": { }, "error": null}codees200si tiene éxito,401cuando la OLT rechazó el inicio de sesión,502para cualquier otro fallo (el error de la OLT está enerror, yrawcontiene la transcripción). Una operación desconocida da404con la lista de operaciones enops.- Tras una escritura exitosa (salvo
savey las ejecuciones de prueba) la respuesta incluye"note": "not saved to the OLT's flash yet — run op \"save\" when done"(aún no guardado en la flash de la OLT; ejecute la operación “save” al terminar).
Las operaciones de escritura necesitan la función de escritura de la licencia, se ejecutan de una en una por OLT y, una vez enviadas, nunca se reintentan por otro transporte. Cada llamada se registra en el router (operación, OLT, resultado — nunca credenciales).
OLT compartidas
Sección titulada «OLT compartidas»Una OLT registrada puede llevar la S-VLAN de este router (svlan) y estar marcada como de otra empresa
(operator). En una OLT así, el router solo toca lo que es suyo: las operaciones de VLAN sobre otra
S-VLAN se rechazan salvo con force=true; las operaciones de ONT rechazan una ONT cuyos service-ports estén en
otra S-VLAN (force nunca anula esto); exec necesita force=true. Los objetos que crea el router
se nombran con su prefijo (por defecto dtvsol, o s<svlan> cuando hay una S-VLAN configurada).
Operaciones: lectura
Sección titulada «Operaciones: lectura»GET /olt
Sección titulada «GET /olt»Lista las operaciones, cuáles de ellas modifican la OLT y cómo llamarlas. No se contacta ninguna OLT.
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt"{ "ops": ["info", "autofind", "onus", "vlans", "serviceports", "profiles", "config", "run", "audit", "boards", "pon-ports", "port-optical", "counters", "exec", "vlan-add", "vlan-del", "port-vlan", "profile-add", "profile-del", "ont-add", "ont-del", "ont-reboot", "ont-desc", "ont-optical", "ntp", "sysname", "save", "plan-sync", "init", "ont-activate", "ont-deactivate", "ont-replan"], "write_ops": ["exec", "vlan-add", "vlan-del", "port-vlan", "profile-add", "profile-del", "ont-add", "ont-del", "ont-reboot", "ont-desc", "ntp", "sysname", "save", "plan-sync", "init", "ont-activate", "ont-deactivate", "ont-replan"], "usage": "POST /olt/{op} with JSON {host, user, pass, [port], [protocol: telnet|ssh], ...op args}; ..."}POST /olt/info
Sección titulada «POST /olt/info»El producto de la OLT, versión de software y parche, tiempo de actividad, nombre de sistema, tarjetas, reloj y estado de NTP.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/info"{ "ok": true, "code": 200, "op": "info", "olt": { "host": "XXX.XXX.XXX.10", "name": "olt-1" }, "took_ms": 1790, "result": { "product": "MA5608T", "version": "V800R018C10", "uptime": "35 day(s), 4 hour(s)", "sysname": "olt-1", "boards": [ { "slot": 0, "board": "GPFD", "status": "Normal" } ], "time": "2026-09-28 12:00:00+00:00", "ntp": "synchronized" }, "error": null}Con credenciales de uso único en lugar de un nombre registrado:
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"host": "XXX.XXX.XXX.10", "user": "admin", "pass": "OLT_PASSWORD", "protocol": "ssh"}' \ "http://ROUTER-IP:8880/olt/info"POST /olt/autofind
Sección titulada «POST /olt/autofind»Las ONT que la OLT ve pero que aún no están registradas (puerto PON, serie, fabricante, cuándo se vieron).
Resultado: {"count": N, "onts": [...]}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/autofind"POST /olt/onus
Sección titulada «POST /olt/onus»Las ONT registradas: id, serie, estado de ejecución/configuración/coincidencia. Resultado: {"count": N, "onts": [...]}.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Puerto PON opcional frame/slot/port, p. ej. 0/1/3. Sin él, todas las tarjetas PON. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3"}' "http://ROUTER-IP:8880/olt/onus"POST /olt/vlans
Sección titulada «POST /olt/vlans»La tabla de VLAN de la OLT y las VLAN etiquetadas en cada puerto de uplink.
Resultado: {"count": N, "vlans": [...], "uplink_ports": {"0/3/0": {"vlans": [100, 101], "native": null}}}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/vlans"POST /olt/serviceports
Sección titulada «POST /olt/serviceports»Los service-ports (flujos de suscriptores). Resultado: {"count": N, "service_ports": [...]}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/serviceports"POST /olt/profiles
Sección titulada «POST /olt/profiles»Los perfiles DBA, de línea y de servicio. Resultado: {"dba": [...], "line": [...], "service": [...]}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/profiles"POST /olt/config
Sección titulada «POST /olt/config»La configuración en ejecución completa de la OLT como texto. Resultado: {"lines": N, "config": "..."}.
Tiempo de espera por defecto 180 s.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/config"POST /olt/run
Sección titulada «POST /olt/run»Ejecuta un comando display … de solo lectura y devuelve su salida sin procesar. Todo lo que no sea un
comando display se rechaza (use exec para la configuración).
Resultado: {"command": "...", "output": "..."}.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
command |
body | string | Obligatorio. Debe comenzar con display. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "command": "display ont info 0 1 3 all"}' "http://ROUTER-IP:8880/olt/run"POST /olt/audit
Sección titulada «POST /olt/audit»Solo lectura: lo que la OLT tiene para este router en su S-VLAN — si la VLAN existe y su tipo, los uplinks en los que está etiquetada, sus service-ports con sus límites de velocidad, las tablas de velocidad, si la opción 82 de DHCP está habilitada, y las ONT de los puertos PON indicados. La usa el doctor del router.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
svlan |
body | integer | Obligatorio. La S-VLAN a auditar. |
ports |
body | array | Puertos PON opcionales cuyas ONT listar, p. ej. ["0/1/3"]. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "svlan": 400, "ports": ["0/1/3"]}' "http://ROUTER-IP:8880/olt/audit"{ "ok": true, "code": 200, "op": "audit", "result": { "svlan": 400, "exists": true, "type": "smart", "attribute": "stacking", "uplinks": [ { "port": "0/3/0", "native_vlan": 1, "state": "up" } ], "service_ports": [ { "index": 12, "state": "up", "pon": "0/1/3", "ont_id": 0, "gem": 1, "flow_type": "vlan", "user_vlan": 100, "inner_vlan": 100, "car": { "in": 11, "out": 10 } } ], "option82": true, "rates": { "10": { "cir": 112640, "pir": 112640 } }, "onts": [], "plan_prefix": "dtvsol" }}POST /olt/boards
Sección titulada «POST /olt/boards»Las tarjetas de la OLT (ranura, tipo, estado).
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/boards"POST /olt/pon-ports
Sección titulada «POST /olt/pon-ports»Los puertos PON y su estado.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Opcional: un puerto PON frame/slot/port; por defecto todos los puertos. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/pon-ports"POST /olt/port-optical
Sección titulada «POST /olt/port-optical»Las lecturas ópticas de los transceptores propios de los puertos PON.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Opcional: un puerto PON; por defecto todos los puertos. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3"}' "http://ROUTER-IP:8880/olt/port-optical"POST /olt/counters
Sección titulada «POST /olt/counters»Contadores de tráfico de los puertos, o de las ONT.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Opcional: un puerto PON. |
ont_id |
body | integer | Opcional: los contadores de una ONT (necesita port). |
uplinks |
body | boolean | Incluye los puertos de uplink. |
onts |
body | boolean | Contadores por ONT para cada ONT (de port si se indica) en lugar de los de los propios puertos. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "uplinks": true}' "http://ROUTER-IP:8880/olt/counters"POST /olt/ont-optical
Sección titulada «POST /olt/ont-optical»Las lecturas ópticas de una ONT: potencia de recepción/transmisión, temperatura, voltaje.
Resultado: {"port": "0/1/3", "onts": [...]}.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Obligatorio. Puerto PON frame/slot/port. |
ont_id |
body | integer or "all" |
Opcional; por defecto todas las ONT del puerto. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0}' "http://ROUTER-IP:8880/olt/ont-optical"Operaciones: modificación de la OLT
Sección titulada «Operaciones: modificación de la OLT»Nada de lo siguiente se guarda en la flash de la OLT hasta POST /olt/save. Los ids de VLAN van de 1 a 4094.
POST /olt/ont-add
Sección titulada «POST /olt/ont-add»Normalmente usted aprovisiona un suscriptor con POST /services (vea la
API de servicios), que llama a esta operación por usted y además configura
el lado del router.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Obligatorio. Puerto PON, p. ej. 0/1/3 (también se acepta pon). |
sn |
body | string | Obligatorio. El número de serie de la ONT como 16 dígitos hexadecimales. |
vlan |
body | integer | Obligatorio. La VLAN del puerto PON. |
user_vlan |
body | integer | La VLAN que envía la ONT; por defecto vlan. |
description |
body | string | Descripción de la ONT. |
plan |
body | string | Un plan de este router: se usan sus perfiles y límites de velocidad (las velocidades incluyen el margen de OLT del router, por defecto ×1.10). 404 si el plan no existe. |
down_kbps, up_kbps |
body | integer | Límites de velocidad explícitos en lugar de plan. |
line_profile, srv_profile, profile_id |
body | integer | Ids de perfil explícitos (profile_id fija ambos; por defecto la vlan). |
svlan |
body | integer | VLAN externa; si se omite, se usa la svlan de una OLT registrada. |
iptv |
body | boolean | Con una OLT registrada: agrega la VLAN de IPTV de la OLT (iptv_vlan) para este suscriptor. |
iptv_vlan |
body | integer | La VLAN de IPTV, de forma explícita. |
eth_ports |
body | integer | Por defecto 1. |
gemport |
body | integer | Por defecto 1. |
dry_run |
body | boolean | Solo planificar. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "sn": "ABCD123456789012", "vlan": 100, "plan": "plan_100_50", "description": "router-1 sub 42"}' \ "http://ROUTER-IP:8880/olt/ont-add"{ "ok": true, "code": 200, "op": "ont-add", "olt": { "host": "XXX.XXX.XXX.10", "name": "olt-1" }, "result": { "port": "0/1/3", "sn": "ABCD123456789012", "ont_id": 0, "vlan": 100, "cvlan": 100, "user_vlan": 100 }, "error": null, "note": "not saved to the OLT's flash yet — run op \"save\" when done"}POST /olt/ont-del
Sección titulada «POST /olt/ont-del»| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Obligatorio. Puerto PON. |
ont_id |
body | integer | Obligatorio. |
force |
body | boolean | Actúa también sobre una ONT que no tiene ningún service-port. |
expect_svlan |
body | integer | Una S-VLAN más que se cuenta como de este router para esta ONT. |
dry_run |
body | boolean | Solo planificar. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0}' "http://ROUTER-IP:8880/olt/ont-del"Resultado: {"port": "0/1/3", "ont_id": 0, "deleted": true, "service_ports_removed": [...]}.
POST /olt/ont-reboot
Sección titulada «POST /olt/ont-reboot»Los mismos parámetros que ont-del (port, ont_id, force, expect_svlan).
Resultado: {"port": "0/1/3", "ont_id": 0, "rebooted": true}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0}' "http://ROUTER-IP:8880/olt/ont-reboot"POST /olt/ont-activate
Sección titulada «POST /olt/ont-activate»Parámetros: port, ont_id, force, expect_svlan. Resultado: {"port": "0/1/3", "ont_id": 0, "active": true}.
Reanudar un servicio (POST /services/{id}/resume) llama a esta operación por usted.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0}' "http://ROUTER-IP:8880/olt/ont-activate"POST /olt/ont-deactivate
Sección titulada «POST /olt/ont-deactivate»Parámetros: port, ont_id, force, expect_svlan. Resultado: {"port": "0/1/3", "ont_id": 0, "active": false}.
Suspender un servicio (POST /services/{id}/suspend) llama a esta operación por usted.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0}' "http://ROUTER-IP:8880/olt/ont-deactivate"POST /olt/ont-desc
Sección titulada «POST /olt/ont-desc»| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Obligatorio. |
ont_id |
body | integer | Obligatorio. |
description |
body | string | La nueva descripción (vacía la borra). |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0, "description": "sub 42"}' \ "http://ROUTER-IP:8880/olt/ont-desc"POST /olt/ont-replan
Sección titulada «POST /olt/ont-replan»Cambiar el plan de un servicio (POST /services/{id} con plan) llama a esta operación por usted.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
port |
body | string | Obligatorio. |
ont_id |
body | integer | Obligatorio. |
plan |
body | string | Obligatorio. El nombre del plan. |
down_kbps, up_kbps |
body | integer | Obligatorio. Los nuevos límites de velocidad. |
vlan |
body | integer | Obligatorio. La VLAN interna. |
user_vlan |
body | integer | Por defecto vlan. |
svlan |
body | integer | En una OLT compartida debe ser la S-VLAN de este router. |
expect_svlan |
body | integer | Como en ont-del. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "port": "0/1/3", "ont_id": 0, "plan": "plan_300_150", "down_kbps": 337920, "up_kbps": 168960, "vlan": 100, "svlan": 400}' \ "http://ROUTER-IP:8880/olt/ont-replan"POST /olt/vlan-add
Sección titulada «POST /olt/vlan-add»| Nombre | En | Tipo | Notas |
|---|---|---|---|
vlan |
body | integer | Obligatorio. |
type |
body | string | smart (por defecto), standard, mux o super. |
attribute |
body | string | common, stacking o qinq. |
description |
body | string | Opcional. |
uplinks |
body | array or string | Puertos de uplink en los que etiquetarla, p. ej. ["0/3/0"] o "0/3/0,0/3/1". |
force |
body | boolean | Necesario para una VLAN distinta de la S-VLAN de este router en una OLT compartida. |
dry_run |
body | boolean | Solo planificar. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "vlan": 100, "uplinks": "0/3/0", "description": "PON 0/1/3"}' \ "http://ROUTER-IP:8880/olt/vlan-add"POST /olt/vlan-del
Sección titulada «POST /olt/vlan-del»| Nombre | En | Tipo | Notas |
|---|---|---|---|
vlan |
body | integer | Obligatorio. |
uplinks |
body | array or string | Puertos de uplink de los que quitarle primero la etiqueta. |
force |
body | boolean | Como en vlan-add. |
dry_run |
body | boolean | Solo planificar. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "vlan": 100, "uplinks": ["0/3/0"]}' "http://ROUTER-IP:8880/olt/vlan-del"POST /olt/port-vlan
Sección titulada «POST /olt/port-vlan»| Nombre | En | Tipo | Notas |
|---|---|---|---|
vlan |
body | integer | Obligatorio. |
port |
body | string | Obligatorio. El puerto, p. ej. 0/3/0. |
remove |
body | boolean | Quitar la etiqueta en lugar de etiquetar. |
force |
body | boolean | Como en vlan-add. |
dry_run |
body | boolean | Solo planificar. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "vlan": 100, "port": "0/3/0"}' "http://ROUTER-IP:8880/olt/port-vlan"Resultado: {"vlan": 100, "port": "0/3/0", "tagged": true}.
POST /olt/profile-add
Sección titulada «POST /olt/profile-add»| Nombre | En | Tipo | Notas |
|---|---|---|---|
vlan |
body | integer | Obligatorio. |
dba |
body | integer | Id del perfil DBA; por defecto 5. |
eth_ports |
body | integer | Por defecto 1. |
profile_id |
body | integer | Por defecto la vlan. |
force |
body | boolean | Anula la protección de propiedad en una OLT compartida. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "vlan": 100, "dba": 5, "eth_ports": 1}' "http://ROUTER-IP:8880/olt/profile-add"POST /olt/profile-del
Sección titulada «POST /olt/profile-del»| Nombre | En | Tipo | Notas |
|---|---|---|---|
profile_id |
body | integer | Obligatorio. |
force |
body | boolean | Anula la protección de propiedad en una OLT compartida. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "profile_id": 100}' "http://ROUTER-IP:8880/olt/profile-del"POST /olt/exec
Sección titulada «POST /olt/exec»En una OLT compartida necesita force=true. Un comando que contenga ? se rechaza.
Resultado: {"executed": N, "steps": [{"cmd": "...", "output": "..."}]}.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
commands |
body | array or string | Obligatorio. Una lista, o un solo texto con los comandos separados por saltos de línea o comas. |
force |
body | boolean | Obligatorio en una OLT compartida. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "commands": ["vlan desc 100 description PON-0-1-3"]}' \ "http://ROUTER-IP:8880/olt/exec"POST /olt/ntp
Sección titulada «POST /olt/ntp»| Nombre | En | Tipo | Notas |
|---|---|---|---|
server |
body | string | Obligatorio. Dirección del servidor NTP. |
remove |
body | boolean | Eliminar en lugar de establecer. |
timezone |
body | string | Zona horaria opcional que se establece junto con él. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "server": "10.0.0.1"}' "http://ROUTER-IP:8880/olt/ntp"Resultado: {"server": "10.0.0.1", "set": true}.
POST /olt/sysname
Sección titulada «POST /olt/sysname»| Nombre | En | Tipo | Notas |
|---|---|---|---|
name |
body | string | Obligatorio. Letras, dígitos, ., _, -. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "name": "olt-1"}' "http://ROUTER-IP:8880/olt/sysname"POST /olt/save
Sección titulada «POST /olt/save»Resultado: {"saved": true, "output": "..."}.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1"}' "http://ROUTER-IP:8880/olt/save"POST /olt/plan-sync
Sección titulada «POST /olt/plan-sync»Cuando no se indica plans, se envían los planes propios del router y su margen de OLT (y la
iptv_vlan de una OLT registrada). Para sincronizar todas las OLT registradas a la vez use POST /olt/sync.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
dry_run |
body | boolean | Solo lista los comandos que ejecutaría. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "dry_run": true}' "http://ROUTER-IP:8880/olt/plan-sync"POST /olt/init
Sección titulada «POST /olt/init»Con una OLT registrada, los valores que faltan provienen del registro (svlan, iptv_vlan, operator), el
nombre de sistema toma por defecto el nombre registrado de la OLT, el NTP la dirección propia del router hacia la OLT,
y los planes, los planes del router. En una OLT registrada como de otra empresa (operator) no se tocan
los ajustes globales de la OLT.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
apply |
body | boolean | Aplica los cambios; por defecto false (ejecución de prueba). |
svlan |
body | integer | La S-VLAN de este router. |
iptv_vlan |
body | integer | VLAN de IPTV. |
uplinks |
body | array or string | Puertos de uplink a usar. |
sysname |
body | string | Nombre de sistema. |
ntp |
body | string | Servidor NTP. |
timezone |
body | string | Zona horaria. |
operator |
body | boolean | Tratar la OLT como de otra empresa. |
router_parent |
body | string | La interfaz del router por la que viajan las S-VLAN de la OLT. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "svlan": 400, "uplinks": "0/3/0"}' "http://ROUTER-IP:8880/olt/init"Resultado (ejecución de prueba, recortado): {"dry_run": true, "svlan": 400, "pon_ports": ["0/1/0", "0/1/1"], "uplinks": ["0/3/0"], "steps": [{"cmd": "..."}]}.
Sincronización de planes
Sección titulada «Sincronización de planes»POST /olt/sync
Sección titulada «POST /olt/sync»Una OLT a la vez. El mismo trabajo se ejecuta por sí solo en segundo plano después de cada cambio de plan y de forma
periódica. También responde a GET con los parámetros en la cadena de consulta.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
olt |
body or query | string | Solo esta OLT registrada. |
dry_run |
body or query | boolean | Solo lista los comandos por OLT. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"olt": "olt-1", "dry_run": true}' "http://ROUTER-IP:8880/olt/sync"{ "ok": true, "code": 200, "dry_run": true, "plans": [ { "name": "plan_100_50", "down_mbps": 100, "up_mbps": 50 } ], "headroom": 1.1, "olts": { "olt-1": { "ok": true, "error": null, "in_sync": false, "executed": 0, "dry_run": true, "commands": ["..."], "changes": { }, "notes": [] } }}502 cuando alguna OLT falló; 404 cuando no hay ninguna OLT registrada o la indicada es desconocida.
GET /olt/sync
Sección titulada «GET /olt/sync»Igual que POST /olt/sync, con olt y dry_run en la cadena de consulta.
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt/sync?dry_run=1"Respaldos de configuración
Sección titulada «Respaldos de configuración»Las configuraciones de las OLT se conservan en el router como un historial (una entrada por cambio). El router las
respalda por sí solo después de los cambios; estas llamadas leen el historial o hacen un respaldo en el momento. olt puede
omitirse cuando hay exactamente una OLT registrada (en caso contrario, 404). Cada una acepta también POST con los
parámetros en el cuerpo.
POST /olt/backup
Sección titulada «POST /olt/backup»Se rechaza con 409 para una OLT registrada como de otra empresa (operator).
| Nombre | En | Tipo | Notas |
|---|---|---|---|
olt |
body or query | string | La OLT registrada. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt/backup?olt=olt-1"{ "code": 200, "olt": "olt-1", "ok": true, "changed": true, "commit": "3f2a9c1", "lines": 2140}502 cuando no se pudo leer la configuración (o parecía incompleta — en ese caso no se guarda nada).
GET /olt/backups
Sección titulada «GET /olt/backups»El historial de respaldos de una OLT, del más reciente al más antiguo, y su estado de mantenimiento.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
olt |
query | string | La OLT registrada. |
n |
query | integer | Cuántas entradas; por defecto 30, 1–500. |
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt/backups?olt=olt-1&n=10"{ "ok": true, "code": 200, "olt": "olt-1", "state": { }, "backups": [ { "commit": "3f2a9c1", "at": "2026-09-28 12:00:00", "what": "olt-1: on request — 1 file changed, 3 insertions(+), 1 deletion(-)" } ]}GET /olt/diff
Sección titulada «GET /olt/diff»Qué cambió en la configuración de una OLT: en un respaldo (por defecto el más reciente), o entre dos.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
olt |
query | string | La OLT registrada. |
rev |
query | string | El id de commit de un respaldo (4–40 dígitos hexadecimales); por defecto el más reciente. |
to |
query | string | Un segundo id de commit: la diferencia entre rev y to. |
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt/diff?olt=olt-1&rev=3f2a9c1"{ "ok": true, "code": 200, "olt": "olt-1", "diff": "3f2a9c1 2026-09-28 12:00:00\n...\n" }Si aún no hay respaldo: "diff": "" y "note": "no backup yet" (aún no hay respaldo). 400 para un id de commit mal formado,
404 para uno desconocido.
El registro de OLT
Sección titulada «El registro de OLT»GET /olts
Sección titulada «GET /olts»Las OLT registradas. Las contraseñas nunca se devuelven (has_pass siempre es true); del acceso SNMP
solo se muestra su versión. Cada entrada incluye el resultado de su última sincronización de planes.
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olts"{ "count": 1, "olts": [ { "name": "olt-1", "vendor": "huawei", "protocol": "telnet", "host": "XXX.XXX.XXX.10", "port": null, "user": "admin", "svlan": 400, "iptv_vlan": 200, "comment": "", "product": "MA5608T", "added": "2026-09-01 10:00:00", "updated": "2026-09-20 09:00:00", "has_pass": true, "snmp": "v3", "last_sync": { "at": "2026-09-28 11:45:00", "ok": true, "in_sync": true } } ], "headroom": 1.1, "plans": 2}POST /olts
Sección titulada «POST /olts»Salvo con force=true, primero se prueba el inicio de sesión (y un nuevo acceso SNMP recibe su propia lectura de prueba); una prueba
fallida da 502 y no se guarda nada. Para una OLT que es de este router (no operator), el router además
configura la fuente de reloj de la OLT.
| Nombre | En | Tipo | Notas |
|---|---|---|---|
name |
body | string | Obligatorio. Letras minúsculas, dígitos, ., _, -, máximo 32; comienza con una letra o un dígito. |
host |
body | string | Obligatorio. Dirección IP o nombre de host. |
user |
body | string | Obligatorio. |
pass |
body | string | Obligatorio. |
protocol |
body | string | telnet (por defecto) o ssh. |
port |
body | integer | Puerto TCP, si no es el predeterminado del protocolo. |
svlan |
body | integer | La S-VLAN de este router en la OLT (1–4094, o null/"none"). |
iptv_vlan |
body | integer | VLAN de IPTV (1–4094, o null/"none"). |
operator |
body | boolean | La OLT pertenece a otra empresa; ahí el router solo gestiona su propia S-VLAN y sus perfiles. |
parent |
body | string | La interfaz del router por la que viajan las S-VLAN de la OLT (debe existir). |
comment |
body | string | Texto libre. |
snmp |
body | object | Acceso SNMP opcional para el driver licenciado (version v3 con usuario y ajustes auth/priv, o v2c/v1 con una comunidad). null lo elimina. |
force |
body | boolean | Guardar sin la prueba de inicio de sesión. |
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"name": "olt-1", "host": "XXX.XXX.XXX.10", "user": "admin", "pass": "OLT_PASSWORD", "protocol": "ssh", "svlan": 400, "iptv_vlan": 200}' \ "http://ROUTER-IP:8880/olts"{ "ok": true, "code": 201, "message": "OLT registered: olt-1", "olt": { "name": "olt-1", "host": "XXX.XXX.XXX.10", "protocol": "ssh", "svlan": 400, "has_pass": true, "snmp": null }, "probe": { "product": "MA5608T" }, "ntp": { }, "next": "dtvsol olt sync --olt olt-1 (pushes the router's plans to it)"}Errores: 400 para campos no válidos, 409 cuando el nombre ya existe, 502 cuando falla la prueba de inicio de sesión
(“send force=true to store anyway”: envíe force=true para guardarla de todos modos).
POST /olts/{name}
Sección titulada «POST /olts/{name}»Los mismos campos que POST /olts (excepto name, que viene de la ruta). El inicio de sesión se vuelve a probar
salvo con force=true. Responde 200 con "message": "OLT updated: olt-1"; 404 para un nombre desconocido.
curl -X POST -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \ -d '{"svlan": 500, "comment": "rack 2"}' "http://ROUTER-IP:8880/olts/olt-1"DELETE /olts/{name}
Sección titulada «DELETE /olts/{name}»El nombre también puede indicarse en el cuerpo como name (con DELETE /olts).
curl -X DELETE -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olts/olt-1"{ "ok": true, "code": 200, "message": "OLT removed: olt-1", "note": "its profiles on the OLT itself are left as they are"}Equivalentes en la API de acciones
Sección titulada «Equivalentes en la API de acciones»La API de acciones toma sus parámetros en la cadena de consulta. Como eso coloca credenciales en una URL,
prefiera las rutas REST anteriores; con una OLT registrada, solo se necesita olt=<name>.
| Acción | Parámetros de consulta | Equivale a |
|---|---|---|
action=olt-<op> (p. ej. action=olt-info) |
olt, o host/user/pass; más los argumentos de la operación |
POST /olt/{op} |
action=olt-sync |
olt, dry_run |
POST /olt/sync |
action=olt-backup |
olt |
POST /olt/backup |
action=olt-backups |
olt, n |
GET /olt/backups |
action=olt-diff |
olt, rev, to |
GET /olt/diff |
action=olts-list |
— | GET /olts |
action=olts-add |
name, host, user, pass, protocol, port, svlan, iptv_vlan, … |
POST /olts |
action=olts-set |
name, campos a cambiar |
POST /olts/{name} |
action=olts-del |
name |
DELETE /olts/{name} |
Este sitio fue escrito con ayuda de IA y revisado por nuestro equipo.