Skip to main content

Paquete de Integración OLT Huawei MA56XXT con Python

Project description

README - jmq_olt_huawei

Paquete de integración con OLTs Huawei MA56XXT (como MA5603T) vía Telnet, diseñado para automatizar la recolección de información GPON desde Python.

🛰️ ¿Qué hace este paquete?

Permite conectarse a una OLT Huawei MA56XXT y ejecutar operaciones como:

  • Listar slots activos (display board 0)
  • Consultar puertos GPON por slot
  • Obtener ONTs conectadas a cada puerto
  • Realizar un escaneo completo (slots → puertos → ONTs)
  • Manejar paginación, prompts dinámicos y errores comunes de sesión

📦 Instalación

pip install jmq_olt_huawei

ó

pip install git+https://github.com/juaquicar/jmq_olt_huawei.git

Instalar proyecto en modo editable

pip3 install -e .

Requiere Python >= 3.6.

🧪 Ejemplo de uso

from jmq_olt_huawei.ma56xxt import APIMA56XXT, UserBusyError
from pprint import pprint

api = APIMA56XXT(
    host='192.168.88.25',
    user='root',
    password='admin',
    prompt='MA5603T',
    debug=True
)

try:
    api.connect()
    result = api.scan_all()
    pprint(result)
except UserBusyError as e:
    print(f"ERROR: {e}")
finally:
    api.disconnect()

Manual de uso de los métodos de APIMA56XXT

1. __init__(host, user, password, prompt, timeout=2.0, debug=False)

Constructor: inicializa la conexión Telnet y el patrón de prompt.

  • Parámetros:

    • host (str): Dirección IP o hostname de la OLT.
    • user (str): Nombre de usuario para login.
    • password (str): Contraseña de usuario.
    • prompt (str): Prefijo dinámico del prompt (ej. MA5603T).
    • timeout (float): Tiempo máximo (segundos) para lecturas Telnet (default 2.0).
    • debug (bool): Si True, imprime logs de depuración.

2. connect()

Establece la conexión Telnet, realiza login, entra en modo enable y modo config.

api = APIMA56XXT(...)
api.connect()
# Salida esperada (con debug=True):
# [DEBUG] Conectando a 192.168.88.25
# Conectado en modo config
  • No devuelve valor.
  • Lanza excepción (EOFError, socket.error) si falla la conexión.

3. disconnect()

Sale de los modos CLI (config, enable) y cierra la sesión Telnet.

api.disconnect()
# Si debug=True, imprime:
# [DEBUG] Desconectado
  • No devuelve valor.
  • Protege contra llamadas dobles comprobando self.tn.

4. get_slots() -> List[Tuple[str, str]]

Obtiene los slots instalados (display board 0) y devuelve una lista de tuplas (slot_id, tipo).

slots = api.get_slots()
# Ejemplo:
# [('0', 'GPBD'), ('6', 'SCUN'), ('7', 'SCUN'), ('9', 'GICF')]
  • Invoca internamente _send('display board 0') y parsea la respuesta.
  • No requiere argumentos.

5. get_ports(slot: str) -> List[dict]

Retorna información de los puertos GPON en un slot dado.

ports = api.get_ports('0')
# Cada dict contiene:
# {
#   'id': 0,
#   'schema_fsp': '0/0/0',
#   'optical_state': 'Online',
#   'port_state': 'Offline',
#   'laser_state': 'Normal',
#   'bw': '1239040',
#   'temperature': '35',
#   'tx_bias': '12',
#   'voltage': '3.22',
#   'tx_power': '3.72',
#   'illegal_rogue_ont': 'Inexistent',
#   'max_distance': '40',
#   'wave_length': '1490',
#   'fiber_type': 'Single Mode',
#   'length': '-'
# }
  • Llama a:

    1. _send('interface gpon 0/{slot}')
    2. _read_until_prompt()
    3. _send('display port state all')
    4. _read_until_prompt()
    5. Parsea cada bloque con _parse_port_block.

6. get_onts(slot: str, port_id: int) -> List[dict]

Devuelve la lista de ONTs conectadas a un puerto GPON específico.

onts = api.get_onts('0', 0)
# Ejemplo resultado:
# [
#   {'id': 0, 'schema_fsp': '0/0/0', 'sn': '485754431CC32E32',
#    'control_flag': 'active', 'run_state': 'offline',
#    'config_state': 'initial', 'match_state': 'initial',
#    'protect_side': 'no', 'description': 'aGIS:'},
#   ...
# ]
  • Ejecuta _send(f'display ont info {port_id} all') y _read_until_prompt().
  • Procesa tabla principal (F/S/P ONT SN ...) y sección de descripciones.

7. scan_all() -> List[dict]

Realiza un escaneo completo de la OLT:

  1. Obtiene todos los slots (get_slots).
  2. Para cada slot de tipo GPBD, obtiene puertos (get_ports).
  3. Para cada puerto Online, obtiene ONTs (get_onts).
full = api.scan_all()
pprint(full)
  • Devuelve una lista de diccionarios con la jerarquía: { 'id': slot, 'tipo': tipo, 'ports': [ {port}, ... ] }

Nota: Todos los métodos manejan paginación (More, ---- More) y bloqueos de usuario (UserBusyError). Para más detalles, revisa los métodos privados _read_until_prompt, _parse_port_block y _parse_onts.

📁 Estructura del paquete

jmq_olt_huawei/
│
├── ma56xxt.py          # Lógica principal de conexión y parsing
├── __init__.py         # Archivo de inicialización del paquete
├── Examples/           # Scripts de ejemplo (opcional)
├── tests/              # Pruebas automatizadas (pendiente)
├── requirements.txt    # Requisitos opcionales para desarrollo
├── pyproject.toml      # Configuración de build con setuptools
├── LICENSE             # Licencia MIT
└── README.md           # Este archivo

Tests

pytest -s tests/test_ma56xxt.py

🧩 Funcionalidades destacadas

  • Prompt dinámico configurable
  • Manejador de errores comunes como bloqueo de usuario
  • Soporte para múltiples niveles de lectura (slots → puertos → ONTs)
  • Debug opcional para inspeccionar línea a línea

Contribuyendo

  1. Haz un fork del repositorio.
  2. Crea una rama (git checkout -b feature/nueva-funcionalidad).
  3. Realiza tus cambios y añade tests, modifica README.md si estimas oportuno.
  4. Abre un Pull Request al main describiendo tu propuesta.

⚖️ Licencia

MIT © Juanma Quijada

Enlaces

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jmq_olt_huawei-0.1.1.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jmq_olt_huawei-0.1.1-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

Details for the file jmq_olt_huawei-0.1.1.tar.gz.

File metadata

  • Download URL: jmq_olt_huawei-0.1.1.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for jmq_olt_huawei-0.1.1.tar.gz
Algorithm Hash digest
SHA256 d0ad0576ae70a76634c148df754296397a9ddd79f3447ea7c22e7558307898a2
MD5 611cb92bab01c14d4cf62f725c04f8e2
BLAKE2b-256 297bc7407968f6a135952eab2b3ad532c650babaff310bdb089c80a2024d0423

See more details on using hashes here.

Provenance

The following attestation bundles were made for jmq_olt_huawei-0.1.1.tar.gz:

Publisher: python-publish.yml on juaquicar/jmq_olt_huawei

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file jmq_olt_huawei-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: jmq_olt_huawei-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 8.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for jmq_olt_huawei-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 15474f2f1a5177439612fe69c4001638b82c17ee1a2f9197d4256f5b583af9d3
MD5 027f8999b26d67c6faa44578b5694638
BLAKE2b-256 c5c7eb6d5876ed9da6c94ab9ff31200651937ed03d65ade1b45767f53a354359

See more details on using hashes here.

Provenance

The following attestation bundles were made for jmq_olt_huawei-0.1.1-py3-none-any.whl:

Publisher: python-publish.yml on juaquicar/jmq_olt_huawei

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page