PearlPBX2
← Todas las publicaciones

PearlPBX2 2.7.3: AGPL-3.0, actualización de Asterisk en caliente, TLS para WebRTC

La versión 2.7.3 es una actualización grande: nueva licencia, una forma segura de actualizar el propio Asterisk sin reinstalar, TLS automático para WebRTC y una ampliación considerable de la API REST.

Licencia: el paso a GNU AGPL-3.0

PearlPBX2 ya no se distribuye bajo la PolyForm Shield License 1.0.0 — ahora es la GNU Affero General Public License v3.0-or-later, una licencia abierta reconocida por la OSI. Se elimina la restricción de uso competitivo; en su lugar rige el copyleft de uso en red: una versión modificada desplegada como servicio en red debe divulgarse a los usuarios de ese servicio. Para el análisis completo, consulta el post dedicado al cambio de licencia.

Actualizar Asterisk sin reinstalar: update-asterisk.sh

Antes de esta versión, cambiar asterisk_version en ansible/group_vars/all.yml no hacía nada en un host ya instalado — el bloque de compilación del rol asterisk solo se ejecutaba si /usr/sbin/asterisk no existía. El nuevo update-asterisk.sh (rol asterisk_update) cierra ese hueco: hace copia de seguridad de /etc/asterisk, los binarios, los módulos y /var/lib/asterisk en un directorio con marca de tiempo y un registro en state.json; compila la nueva versión mientras el Asterisk actual sigue atendiendo llamadas; drena las llamadas activas con cuidado (core stop gracefully, tiempo de espera configurable, --no-wait para una parada inmediata); ejecuta solo make install, sin tocar la configuración, los sonidos, los logs, el spool ni las grabaciones; y reinicia Asterisk y los servicios conectados a AMI, verificando la versión tras el arranque. update-asterisk.sh --rollback restaura los binarios anteriores desde la copia de seguridad, y -l/--list muestra el historial de actualizaciones.

Certificados TLS automáticos para WebRTC (wss)

El rol nginx ahora emite por sí mismo un certificado HTTPS/wss:// funcional durante la instalación, sin pasos manuales, en tres niveles: si se indica un dominio (--domain), Let’s Encrypt vía HTTP-01, certificado de 90 días con renovación estándar; si no hay dominio pero se detecta una IPv4 pública, el certificado de IP de corta duración de Let’s Encrypt (6 días, renovado cada 4 horas mediante un temporizador de systemd); si no hay ninguno de los dos disponibles, un certificado autofirmado con un subjectAltName correcto (antes solo tenía CN, que los navegadores modernos rechazan). install.sh y quickstart-install.sh incorporan las opciones --domain/--email.

La API REST ya cubre casi todo el panel

Esta versión añade CRUD para recursos que antes solo se podían editar en el admin de Django: contextos, extensiones y macros de dialplan (/api/v1/dialplan-*), dispositivos telefónicos con un endpoint de aprovisionamiento (/api/v1/phone-devices/<id>/provision/), colas y agentes de cola, tablas de enrutamiento, grupos de troncales, transportes SIP, peers SIP y usuarios SIP, además de un envoltorio sobre Apply Changes (GET /api/v1/config/preview/, POST /api/v1/config/apply/ con un campo mode: "soft"|"hard" obligatorio, solo para superusuario). Los campos secret/md5_cred/priv_key_file ahora se ocultan en las respuestas de listado (GET .../ devuelve null) y solo se muestran al pedir un objeto concreto — esto cierra una fuga de credenciales en las descargas masivas de listas.

Usuarios WebRTC de demostración desde el primer momento

seed_quickstart ahora crea un transporte transport-wss y diez usuarios webrtcuser1–webrtcuser10 con contraseñas aleatorias — una instalación recién hecha ya tiene cuentas funcionales para llamadas desde el navegador.

Cambios más pequeños, pero que se notan

  • install.sh/quickstart-install.sh ahora es completamente desatendido: el rol de firewall ya no se detiene a confirmar el puerto SSH detectado (antes eso podía colgar una ejecución sin TTY, por ejemplo con ansible-pull o en CI) — el puerto ahora solo se registra en el log.
  • Los usuarios SIP de WebRTC recibían un contexto basado en su nombre de usuario, que nunca existió realmente en extensions.ael, así que las llamadas entrantes desde ellos no llegaban a ningún sitio; ahora usan la tabla de enrutamiento del usuario, igual que las cuentas SIP normales.
  • La validación HTTP-01 de Let’s Encrypt se rompía por la propia redirección HTTP → HTTPS del servidor: una petición a /.well-known/acme-challenge/ también caía en el return 301, porque este se ejecutaba antes de la comparación de location. La redirección ahora está envuelta en un bloque location /.
  • A las instalaciones en Debian les faltaba el paquete cron, así que las copias de seguridad y los informes diarios configurados por otros roles no tenían nada que los ejecutara — en Ubuntu funcionaba por casualidad, porque allí cron suele venir preinstalado.
  • Un nuevo python manage.py mail_report envía a diario un correo con las llamadas más largas del día anterior, con enlaces a las grabaciones, a MAIL_REPORT_RECIPIENTS.
  • El validador de dialplan AEL ahora comprueba los destinos de goto/Goto() — antes, goto +0681231231,1; pasaba la validación web, pero Asterisk lo rechazaba al compilar el dialplan.