API de OLT
O roteador controla suas OLTs por meio do driver licenciado do fabricante que acompanha o roteador. Esta página cobre:
- Operações —
POST /olt/{op}: uma operação em uma OLT (ler seu estado, adicionar uma ONT, marcar uma VLAN, …). - O cadastro —
/olts: as OLTs que este roteador conhece pelo nome, com suas credenciais protegidas no roteador. - Sincronização de planos —
/olt/sync: os planos do roteador enviados a cada OLT cadastrada como perfis e tabelas de velocidade. - Backups —
/olt/backup,/olt/backups,/olt/diff: o histórico de configuração das OLTs.
URL base, autenticação (X-API-Key), formato de erro e a action API estão descritos na
visão geral da API.
Escolha da OLT
Seção intitulada “Escolha da OLT”Toda operação precisa de uma OLT. O roteador a escolhe nesta ordem:
oltno corpo (ou cabeçalhoX-OLT-Name) — uma OLT cadastrada, pelo nome. Um nome desconhecido gera404.host,user,passno corpo (ou cabeçalhosX-OLT-Host,X-OLT-User,X-OLT-Pass), comprotocolopcional (telnetoussh, padrãotelnet; cabeçalhoX-OLT-Protocol) eport(a porta TCP da OLT; cabeçalhoX-OLT-Port).passwordé aceito como alias depass.- Nada — quando há exatamente uma OLT cadastrada, essa.
Caso contrário, a resposta é 400 (“name a registered OLT (olt) or send host, user and pass on this call”).
Um port numérico no corpo é a porta TCP da OLT; uma porta PON como "0/1/3" em port é um
argumento da operação. pon é aceito como alias da porta PON.
Opções comuns e a resposta
Seção intitulada “Opções comuns e a resposta”| Nome | Em | Tipo | Observações |
|---|---|---|---|
olt |
body | string | O nome de uma OLT cadastrada (veja acima). |
host, user, pass |
body | string | Credenciais avulsas em vez de olt. |
protocol |
body | string | telnet (padrão) ou ssh. |
vendor |
body | string | Fabricante do driver para credenciais avulsas; padrão huawei. Uma OLT cadastrada usa o seu próprio. |
timeout |
body | integer | Segundos, 10–300. Padrão 40; 180 para config, plan-sync e init. |
raw |
body | boolean | Devolve também cada comando enviado e a resposta da OLT (raw). Sempre incluído em caso de falha. |
dry_run |
body | boolean | As operações de escrita que o suportam apenas planejam a mudança e devolvem o que fariam. |
force |
body | boolean | Ignora uma proteção quando a operação permite (veja OLTs compartilhadas). |
Toda operação responde com o mesmo envelope:
{ "ok": true, "code": 200, "op": "info", "olt": { "host": "XXX.XXX.XXX.10", "name": "olt-1" }, "took_ms": 1790, "result": { }, "error": null}codeé200em caso de sucesso,401quando a OLT recusou o login,502para qualquer outra falha (o erro da OLT está emerror, erawcontém a transcrição). Uma operação desconhecida gera404com a lista de operações emops.- Após uma escrita bem-sucedida (exceto
savee simulações), a resposta traz"note": "not saved to the OLT's flash yet — run op \"save\" when done".
As operações de escrita exigem o recurso de escrita da licença, rodam uma de cada vez por OLT e nunca são repetidas por outro transporte depois de enviadas. Cada chamada é registrada no roteador (operação, OLT, resultado — nunca as credenciais).
OLTs compartilhadas
Seção intitulada “OLTs compartilhadas”Uma OLT cadastrada pode levar a S-VLAN deste roteador (svlan) e ser marcada como de outra empresa
(operator). Em uma OLT assim, o roteador só mexe no que é seu: operações de VLAN em outra
S-VLAN são recusadas a menos que force=true; operações de ONT recusam uma ONT cujos service-ports estão em
outra S-VLAN (force nunca contorna isso); exec exige force=true. Os objetos que o roteador cria
recebem o seu prefixo (padrão dtvsol, ou s<svlan> quando há uma S-VLAN definida).
Operações: leitura
Seção intitulada “Operações: leitura”GET /olt
Seção intitulada “GET /olt”Lista as operações, quais delas alteram a OLT e como chamá-las. Nenhuma OLT é contatada.
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
Seção intitulada “POST /olt/info”O produto da OLT, versão de software e patch, uptime, nome do sistema, placas, relógio e estado do 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}Com credenciais avulsas em vez de um nome cadastrado:
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
Seção intitulada “POST /olt/autofind”As ONTs que a OLT enxerga mas que ainda não estão registradas (porta PON, serial, fabricante, quando foram vistas).
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
Seção intitulada “POST /olt/onus”As ONTs registradas: id, serial, estado de run/config/match. Resultado: {"count": N, "onts": [...]}.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Porta PON opcional frame/slot/port, p. ex. 0/1/3. Sem ela, todas as placas 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
Seção intitulada “POST /olt/vlans”A tabela de VLANs da OLT e as VLANs marcadas em cada porta 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
Seção intitulada “POST /olt/serviceports”Os service-ports (fluxos dos assinantes). 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
Seção intitulada “POST /olt/profiles”Os perfis DBA, de linha e de serviço. 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
Seção intitulada “POST /olt/config”A configuração em execução completa da OLT, como texto. Resultado: {"lines": N, "config": "..."}.
Timeout padrão de 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
Seção intitulada “POST /olt/run”Executa um comando somente leitura display … e devolve sua saída bruta. Qualquer coisa que não seja um
comando display é recusada (use exec para configuração).
Resultado: {"command": "...", "output": "..."}.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
command |
body | string | Obrigatório. Deve começar com 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
Seção intitulada “POST /olt/audit”Somente leitura: o que a OLT mantém para este roteador na sua S-VLAN — se a VLAN existe e seu tipo, os uplinks em que está marcada, seus service-ports com os limites de velocidade, as tabelas de velocidade, se a option 82 do DHCP está habilitada, e as ONTs das portas PON informadas. Usado pelo doctor do roteador.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
svlan |
body | integer | Obrigatório. A S-VLAN a auditar. |
ports |
body | array | Portas PON opcionais cujas ONTs listar, p. ex. ["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
Seção intitulada “POST /olt/boards”As placas da OLT (slot, 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
Seção intitulada “POST /olt/pon-ports”As portas PON e seu estado.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Opcional: uma porta PON frame/slot/port; padrão todas as portas. |
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
Seção intitulada “POST /olt/port-optical”As leituras ópticas dos próprios transceptores das portas PON.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Opcional: uma porta PON; padrão todas as portas. |
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
Seção intitulada “POST /olt/counters”Contadores de tráfego das portas, ou das ONTs.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Opcional: uma porta PON. |
ont_id |
body | integer | Opcional: os contadores de uma ONT (exige port). |
uplinks |
body | boolean | Inclui as portas de uplink. |
onts |
body | boolean | Contadores por ONT para todas as ONTs (de port, se informado) em vez dos contadores das próprias portas. |
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
Seção intitulada “POST /olt/ont-optical”As leituras ópticas de uma ONT: potência de recepção/transmissão, temperatura, tensão.
Resultado: {"port": "0/1/3", "onts": [...]}.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Obrigatório. Porta PON frame/slot/port. |
ont_id |
body | integer ou "all" |
Opcional; padrão todas as ONTs da porta. |
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"Operações: alterando a OLT
Seção intitulada “Operações: alterando a OLT”Nada do que vem abaixo é salvo na flash da OLT até POST /olt/save. Os ids de VLAN vão de 1 a 4094.
POST /olt/ont-add
Seção intitulada “POST /olt/ont-add”Normalmente você provisiona um assinante com POST /services (veja a
API de serviços), que chama esta operação por você e também configura o
lado do roteador.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Obrigatório. Porta PON, p. ex. 0/1/3 (pon também é aceito). |
sn |
body | string | Obrigatório. O serial da ONT com 16 dígitos hexadecimais. |
vlan |
body | integer | Obrigatório. A VLAN da porta PON. |
user_vlan |
body | integer | A VLAN que a ONT envia; padrão vlan. |
description |
body | string | Descrição da ONT. |
plan |
body | string | Um plano deste roteador: são usados seus perfis e limites de velocidade (as velocidades incluem a folga de OLT do roteador, padrão ×1,10). 404 se o plano não existir. |
down_kbps, up_kbps |
body | integer | Limites de velocidade explícitos em vez de plan. |
line_profile, srv_profile, profile_id |
body | integer | Ids de perfil explícitos (profile_id define os dois; padrão a vlan). |
svlan |
body | integer | VLAN externa; quando omitida, é usada a svlan de uma OLT cadastrada. |
iptv |
body | boolean | Com uma OLT cadastrada: adiciona a VLAN de IPTV da OLT (iptv_vlan) para este assinante. |
iptv_vlan |
body | integer | A VLAN de IPTV, explicitamente. |
eth_ports |
body | integer | Padrão 1. |
gemport |
body | integer | Padrão 1. |
dry_run |
body | boolean | Apenas planeja. |
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
Seção intitulada “POST /olt/ont-del”| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Obrigatório. Porta PON. |
ont_id |
body | integer | Obrigatório. |
force |
body | boolean | Atua também sobre uma ONT que não tem nenhum service-port. |
expect_svlan |
body | integer | Mais uma S-VLAN considerada deste roteador para esta ONT. |
dry_run |
body | boolean | Apenas planeja. |
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
Seção intitulada “POST /olt/ont-reboot”Mesmos parâmetros de 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
Seção intitulada “POST /olt/ont-activate”Parâmetros: port, ont_id, force, expect_svlan. Resultado: {"port": "0/1/3", "ont_id": 0, "active": true}.
Retomar um serviço (POST /services/{id}/resume) chama esta operação por você.
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
Seção intitulada “POST /olt/ont-deactivate”Parâmetros: port, ont_id, force, expect_svlan. Resultado: {"port": "0/1/3", "ont_id": 0, "active": false}.
Suspender um serviço (POST /services/{id}/suspend) chama esta operação por você.
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
Seção intitulada “POST /olt/ont-desc”| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Obrigatório. |
ont_id |
body | integer | Obrigatório. |
description |
body | string | A nova descrição (vazia a apaga). |
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
Seção intitulada “POST /olt/ont-replan”Alterar o plano de um serviço (POST /services/{id} com plan) chama esta operação por você.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
port |
body | string | Obrigatório. |
ont_id |
body | integer | Obrigatório. |
plan |
body | string | Obrigatório. O nome do plano. |
down_kbps, up_kbps |
body | integer | Obrigatório. Os novos limites de velocidade. |
vlan |
body | integer | Obrigatório. A VLAN interna. |
user_vlan |
body | integer | Padrão vlan. |
svlan |
body | integer | Deve ser a S-VLAN deste roteador em uma OLT compartilhada. |
expect_svlan |
body | integer | Como em 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
Seção intitulada “POST /olt/vlan-add”| Nome | Em | Tipo | Observações |
|---|---|---|---|
vlan |
body | integer | Obrigatório. |
type |
body | string | smart (padrão), standard, mux ou super. |
attribute |
body | string | common, stacking ou qinq. |
description |
body | string | Opcional. |
uplinks |
body | array ou string | Portas de uplink em que marcá-la, p. ex. ["0/3/0"] ou "0/3/0,0/3/1". |
force |
body | boolean | Necessário para uma VLAN diferente da S-VLAN deste roteador em uma OLT compartilhada. |
dry_run |
body | boolean | Apenas planeja. |
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
Seção intitulada “POST /olt/vlan-del”| Nome | Em | Tipo | Observações |
|---|---|---|---|
vlan |
body | integer | Obrigatório. |
uplinks |
body | array ou string | Portas de uplink das quais desmarcá-la antes. |
force |
body | boolean | Como em vlan-add. |
dry_run |
body | boolean | Apenas planeja. |
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
Seção intitulada “POST /olt/port-vlan”| Nome | Em | Tipo | Observações |
|---|---|---|---|
vlan |
body | integer | Obrigatório. |
port |
body | string | Obrigatório. A porta, p. ex. 0/3/0. |
remove |
body | boolean | Desmarca em vez de marcar. |
force |
body | boolean | Como em vlan-add. |
dry_run |
body | boolean | Apenas planeja. |
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
Seção intitulada “POST /olt/profile-add”| Nome | Em | Tipo | Observações |
|---|---|---|---|
vlan |
body | integer | Obrigatório. |
dba |
body | integer | Id do perfil DBA; padrão 5. |
eth_ports |
body | integer | Padrão 1. |
profile_id |
body | integer | Padrão a vlan. |
force |
body | boolean | Ignora a proteção de propriedade em uma OLT compartilhada. |
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
Seção intitulada “POST /olt/profile-del”| Nome | Em | Tipo | Observações |
|---|---|---|---|
profile_id |
body | integer | Obrigatório. |
force |
body | boolean | Ignora a proteção de propriedade em uma OLT compartilhada. |
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
Seção intitulada “POST /olt/exec”Em uma OLT compartilhada exige force=true. Um comando que contenha ? é recusado.
Resultado: {"executed": N, "steps": [{"cmd": "...", "output": "..."}]}.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
commands |
body | array ou string | Obrigatório. Uma lista, ou um texto com comandos separados por quebras de linha ou vírgulas. |
force |
body | boolean | Obrigatório em uma OLT compartilhada. |
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
Seção intitulada “POST /olt/ntp”| Nome | Em | Tipo | Observações |
|---|---|---|---|
server |
body | string | Obrigatório. Endereço do servidor NTP. |
remove |
body | boolean | Remove em vez de definir. |
timezone |
body | string | Fuso horário opcional a definir junto. |
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
Seção intitulada “POST /olt/sysname”| Nome | Em | Tipo | Observações |
|---|---|---|---|
name |
body | string | Obrigatório. 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
Seção intitulada “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
Seção intitulada “POST /olt/plan-sync”Quando plans não é informado, são enviados os planos e a folga de OLT do próprio roteador (e a
iptv_vlan de uma OLT cadastrada). Para sincronizar todas as OLTs cadastradas de uma vez, use POST /olt/sync.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
dry_run |
body | boolean | Apenas lista os comandos que executaria. |
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
Seção intitulada “POST /olt/init”Com uma OLT cadastrada, os valores ausentes vêm do cadastro (svlan, iptv_vlan, operator), o
nome do sistema assume por padrão o nome cadastrado da OLT, o NTP o próprio endereço do roteador voltado para a OLT,
e os planos os planos do roteador. Em uma OLT cadastrada como de outra empresa (operator), as
configurações globais da OLT não são tocadas.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
apply |
body | boolean | Aplica as mudanças; padrão false (simulação). |
svlan |
body | integer | A S-VLAN deste roteador. |
iptv_vlan |
body | integer | VLAN de IPTV. |
uplinks |
body | array ou string | Portas de uplink a usar. |
sysname |
body | string | Nome do sistema. |
ntp |
body | string | Servidor NTP. |
timezone |
body | string | Fuso horário. |
operator |
body | boolean | Trata a OLT como de outra empresa. |
router_parent |
body | string | A interface do roteador sobre a qual trafegam as S-VLANs da 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 (simulação, resumido): {"dry_run": true, "svlan": 400, "pon_ports": ["0/1/0", "0/1/1"], "uplinks": ["0/3/0"], "steps": [{"cmd": "..."}]}.
Sincronização de planos
Seção intitulada “Sincronização de planos”POST /olt/sync
Seção intitulada “POST /olt/sync”Uma OLT de cada vez. O mesmo trabalho roda sozinho em segundo plano após cada mudança de plano e por um
temporizador. Também responde a GET com os parâmetros na query string.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
olt |
body ou query | string | Apenas esta OLT cadastrada. |
dry_run |
body ou query | boolean | Apenas lista os 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 quando alguma OLT falhou; 404 quando nenhuma OLT está cadastrada ou a informada é desconhecida.
GET /olt/sync
Seção intitulada “GET /olt/sync”O mesmo que POST /olt/sync, com olt e dry_run na query string.
curl -H "X-API-Key: YOUR_API_KEY" "http://ROUTER-IP:8880/olt/sync?dry_run=1"Backups de configuração
Seção intitulada “Backups de configuração”As configurações das OLTs são mantidas no roteador como um histórico (uma entrada por mudança). O roteador
faz o backup delas sozinho após as mudanças; estas chamadas leem o histórico ou fazem um backup agora. olt pode
ser omitido quando há exatamente uma OLT cadastrada (404 caso contrário). Cada uma também aceita POST com os
parâmetros no corpo.
POST /olt/backup
Seção intitulada “POST /olt/backup”Recusado com 409 para uma OLT cadastrada como de outra empresa (operator).
| Nome | Em | Tipo | Observações |
|---|---|---|---|
olt |
body ou query | string | A OLT cadastrada. |
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 quando não foi possível ler a configuração (ou ela parecia incompleta — nesse caso nada é armazenado).
GET /olt/backups
Seção intitulada “GET /olt/backups”O histórico de backups de uma OLT, do mais recente para o mais antigo, e seu estado de manutenção.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
olt |
query | string | A OLT cadastrada. |
n |
query | integer | Quantas entradas; padrão 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
Seção intitulada “GET /olt/diff”O que mudou na configuração de uma OLT: em um backup (padrão o mais recente), ou entre dois.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
olt |
query | string | A OLT cadastrada. |
rev |
query | string | O id de commit de um backup (4–40 dígitos hexadecimais); padrão o mais recente. |
to |
query | string | Um segundo id de commit: o diff entre rev e 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" }Sem nenhum backup ainda: "diff": "" e "note": "no backup yet". 400 para um id de commit malformado,
404 para um desconhecido.
O cadastro de OLTs
Seção intitulada “O cadastro de OLTs”GET /olts
Seção intitulada “GET /olts”As OLTs cadastradas. As senhas nunca são devolvidas (has_pass é sempre true); do acesso SNMP
só é mostrada a versão. Cada entrada traz o resultado da sua última sincronização de planos.
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
Seção intitulada “POST /olts”A menos que force=true, o login é testado antes (e um novo acesso SNMP recebe sua própria leitura de teste); um teste
com falha gera 502 e nada é armazenado. Para uma OLT que pertence a este roteador (não operator), o roteador também
define a fonte de relógio da OLT.
| Nome | Em | Tipo | Observações |
|---|---|---|---|
name |
body | string | Obrigatório. Letras minúsculas, dígitos, ., _, -, máx. 32; começa com letra ou dígito. |
host |
body | string | Obrigatório. Endereço IP ou nome de host. |
user |
body | string | Obrigatório. |
pass |
body | string | Obrigatório. |
protocol |
body | string | telnet (padrão) ou ssh. |
port |
body | integer | Porta TCP, se não for a padrão do protocolo. |
svlan |
body | integer | A S-VLAN deste roteador na OLT (1–4094, ou null/"none"). |
iptv_vlan |
body | integer | VLAN de IPTV (1–4094, ou null/"none"). |
operator |
body | boolean | A OLT pertence a outra empresa; ali o roteador gerencia apenas sua própria S-VLAN e seus perfis. |
parent |
body | string | A interface do roteador sobre a qual trafegam as S-VLANs da OLT (deve existir). |
comment |
body | string | Texto livre. |
snmp |
body | object | Acesso SNMP opcional para o driver licenciado (version v3 com usuário e configurações auth/priv, ou v2c/v1 com uma community). null o remove. |
force |
body | boolean | Armazena sem o teste de login. |
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)"}Erros: 400 para campos inválidos, 409 quando o nome já existe, 502 quando o teste de login falha
(“send force=true to store anyway”).
POST /olts/{name}
Seção intitulada “POST /olts/{name}”Os mesmos campos de POST /olts (exceto name, que vem do caminho). O login é testado novamente
a menos que force=true. Responde 200 com "message": "OLT updated: olt-1"; 404 para um nome desconhecido.
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}
Seção intitulada “DELETE /olts/{name}”O nome também pode ser informado no corpo como name (com 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 na action API
Seção intitulada “Equivalentes na action API”A action API recebe seus parâmetros na query string. Como isso coloca as credenciais em uma URL,
prefira as rotas REST acima; com uma OLT cadastrada, basta olt=<name>.
| Ação | Parâmetros de query | Equivale a |
|---|---|---|
action=olt-<op> (p. ex. action=olt-info) |
olt, ou host/user/pass; mais os argumentos da operação |
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 alterar |
POST /olts/{name} |
action=olts-del |
name |
DELETE /olts/{name} |
Este site foi escrito com a ajuda de IA e revisado pela nossa equipe.