Skip to main content

coms-consume-roan

Paquete de Python que consulta tickets (incidentes) del webservice SOAP COMS de CA ServiceDesk y los inserta en la base de datos MySQL automcae mediante stored procedures. Pensado para ejecutarse agendado (Control-M), sin intervención manual, en un servidor con acceso a la red interna / VPN.

Tabla de contenido

¿Qué hace?

  1. Se conecta al webservice SOAP consulta_tck_complete de ServiceDesk (COMS) y trae los incidentes del grupo Diagnostico Enlaces y Equipos dentro de una ventana de tiempo.
  2. Filtra los tickets por categoría permitida (enlaces, redes regionales, satelital, PBX de hardware).
  3. Clasifica cada ticket:
    • RE (resuelto) → tabla talistincidente (o talistincidente_pbx si el resumen empieza con PBX).
    • OP (abierto) → tabla talistincidente_val (o talistincidente_pbx si es PBX).
  4. Inserta los tickets vía stored procedures (sp_inslistincidente, sp_inslistincidente_val, sp_inslistincidente_pbx).
  5. Lleva un control de ejecuciones (tabla de control) para saber qué rango de horas ya se consultó y si la ejecución fue exitosa.

Arquitectura del paquete

coms_consume_roan/
├── main.py                    # Orquestador: RequestTicketsWS (nocturno / diurno)
├── config/
│   └── database.py            # Conexión pymysql, resuelve credenciales al conectar
├── secure/
│   └── secure.py               # Cifrado/descifrado de credenciales (access.txt -> credentials.enc)
├── src/
│   ├── consumo_coms.py         # SoapIntegracionComs: consulta SOAP + clasificación + insert
│   └── exceptions/
│       └── exceptions.py       # CredentialsNotFoundError
├── data/
│   ├── dto/
│   │   └── dto_database.py     # DatabaseIncidenteDTO (dataclass, mapea columnas del SP)
│   └── dao/
│       └── dao_db.py           # DatabaseIncidenteDAO, DatabaseConexionesDAO, DatabaseConexionesControlM, DatabaseEjecutarSP
└── utils/
    └── utils.py                # Cálculo de timestamps (zona America/Mexico_City) y normalización de datos

Dependencias propias del autor (no en PyPI público general): secure-credentials-roan (cifrado de credenciales) y w-log-roan (logging estandarizado).

Requisitos

  • Python 3.10 o superior.
  • Acceso a la base de datos MySQL automcae y al WSDL de ServiceDesk: requiere estar dentro de la red interna / VPN.
  • Los stored procedures (sp_inslistincidente*, sp_selsdbuscatck, sp_seltacontrolejecucionescoms, sp_updtacontrolejecucionescoms, sp_updresetcntlejec) ya deben existir en la base de datos.
  • Permisos de escritura en C:\logs\ (rutas de log fijas, ver sección Logs).

Instalación

pip install coms-consume-roan
pip install --index-url https://{username}:{password}@gitea.example.com/api/packages/{owner}/pypi/simple --no-deps {package_name}

Configuración de credenciales

La conexión a la base de datos no usa variables de entorno para host/usuario/password: usa un archivo cifrado en disco.

  1. Crear un archivo access.txt con este formato:
    host=...
    user=...
    password=...
    database=...
    port=...
    
  2. Colocarlo en el directorio de datos seguros (ver variable de entorno abajo).
  3. Al ejecutar el paquete por primera vez, access.txt se cifra automáticamente en credentials.enc + secret.key (en el mismo directorio) y el access.txt original se borra.
  4. En ejecuciones posteriores, las credenciales se descifran en memoria cada vez que se abre una conexión (no se cachean en disco en texto plano).

Variable de entorno COMS_SECURE_DATA_DIR

Define dónde viven access.txt / credentials.enc / secret.key. Si no se define, se usa secure_data/ anclado a la raíz del proyecto (solo válido para desarrollo local, no para una instalación vía pip en site-packages).

$env:COMS_SECURE_DATA_DIR = "C:\ruta\a\secure_data"

Recomendado: definir esta variable de entorno de forma permanente en el servidor donde se agenda el proceso (Control-M), apuntando a una ruta segura fuera del propio paquete instalado.

Flujo de ejecución

El paquete expone dos rutinas dentro de RequestTicketsWS (main.py):

  • call_connWS_nocturno(): pensado para la ejecución agendada por Control-M (3 veces al día).
    1. DatabaseConexionesControlM.get_tabla_ejecuciones() consulta el SP sp_seltacontrolejecucionescoms y obtiene el número de ejecución (noEjec) y el rango de horas a consultar (horaInic, horaFin).
    2. Se calcula el rango de timestamps: la hora de inicio se toma del día anterior y la hora de fin del día actual (zona horaria America/Mexico_City, convertida a UTC/unix).
    3. Se llama a SoapIntegracionComs().consulta_tck_complete(...), con hasta 10 reintentos si falla.
    4. Según la respuesta, se marca la ejecución como exitosa (1) o fallida (0) vía DatabaseConexionesControlM.update_control_ejecuciones().
  • call_connWS_diurno(): variante que usa el timestamp actual y una ventana fija de 30 minutos hacia atrás (get_current_timestamp / get_timestamp_minus_30_minutes), en vez de la tabla de control de ejecuciones.

Dentro de consulta_tck_complete (consumo_coms.py):

  1. Arma los parámetros de búsqueda del SOAP (CAOpenDateInit, CAOpenDateFinal, CAGroup, etc.) y llama al WSDL obtenido previamente vía DatabaseConexionesDAO.get_url_buscar_tck() (SP sp_selsdbuscatck).
  2. Parsea la respuesta JSON (UDSObjectList).
  3. Por cada ticket: valida categoría permitida (allow_categories), mapea atributos al DTO (llenar_DTO_multiple), detecta si es PBX (check_pbx_status, regex ^PBX en el resumen) y clasifica por estado (RE / OP).
  4. Inserta en lote por tabla (insert_data_incidente, insert_data_incidente_op, insert_data_incidente_pbx), cada inserción usa una variable de sesión MySQL @paerror para validar si el SP tuvo éxito.

Uso

Instalado, expone el comando de consola:

coms-consume

Equivalente en desarrollo (sin instalar el paquete):

python -m coms_consume_roan.main

Nota: este comando reemplaza al antiguo python main.py. Si el proceso está agendado en Control-M, hay que actualizar el comando invocado.

Logs

Cada módulo escribe su propio log bajo C:\logs\<módulo>\<módulo>_AAAAMMDD.log, con una subcarpeta errors\ para los mensajes de nivel error. Módulos con log propio: main, consumo_coms, database, secure, dao_db. Ruta no configurable actualmente (fija en cada archivo fuente).

Tests

Pruebas unitarias con unittest en tests/. Todas las conexiones externas (BD, WS SOAP, cifrado de credenciales) están mockeadas — no requieren VPN, BD real ni access.txt.

python -m unittest discover -s tests -v

Build y publicación

python -m build
twine check dist/*
twine upload dist/*

Estado actual / notas importantes

  • La función main() del entry point (coms-consume) actualmente solo instancia RequestTicketsWS() y registra el log de inicio; no invoca call_connWS_nocturno() ni call_connWS_diurno() automáticamente. Si se desea que Control-M dispare el flujo completo, se debe ajustar main() para llamar al método correspondiente según el horario de ejecución.
  • Las categorías de ticket permitidas están hardcodeadas en SoapIntegracionComs.allow_categories() (enlaces, redes regionales, satelital, hardware router/switch PBX); cualquier ticket fuera de esas categorías se descarta silenciosamente.
  • El paquete depende de dos librerías propias del autor no publicadas en el índice público de PyPI: secure-credentials-roan y w-log-roan.

Licencia

MIT License. Ver archivo LICENSE.

Autor

Angel Rogelio Argonza Roblero

Metadata

Release files for coms-consume-roan 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for coms-consume-roan 0.1.4
File Size Uploaded Provenance
coms_consume_roan-0.1.4.tar.gz 27.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for coms-consume-roan 0.1.4
File Interpreter ABI Platform
coms_consume_roan-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 46.8 kB

Release files / coms_consume_roan-0.1.4.tar.gz

Download URL coms_consume_roan-0.1.4.tar.gz
Size 27.2 kB
Tags Source
SHA-256 checksum
How to use checksums
953357323440be358ac14eff5f2019dd65b12a09c541e1b6172a962f15ef90e3
BLAKE2b-256 checksum
How to use checksums
bd999a4c9b84ea44d269c2c3075a4155001392c25143501007ce609dddbec21a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release files / coms_consume_roan-0.1.4-py3-none-any.whl

Download URL coms_consume_roan-0.1.4-py3-none-any.whl
Size 19.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
21758a652f441a8f653ff75f374a4be173d87ace1cb0278b4fe1c55cc0bba18b
BLAKE2b-256 checksum
How to use checksums
510810c05a5e093c7e4fe891e5d60c027ec69a7c39171b6e3b03a6c9ccf5d584
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Security for coms-consume-roan 0.1.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page