El Lunes, 31 de Diciembre de 2007, Iñaki Baz Castillo escribió:
Ala, en mi último minuto laboral del 2007 lo he
conseguido:
- OpenSer multidominio
- Asterisk como servidor de voicemail en BD y RealTime para usuarios SIP.
- Voicemail con MWI multidominio.
Para esto último he tenido que pelearme con el módulo UAC para modificar el
Fromusername cuando el INVITE llega al Asterisk:
ibc(a)dominio.com --> ibc_dominio.com(a)dominio.com
La vista de la tabla de usuarios SIP la he hecho con este detalle:
CREATE VIEW asterisk_sip_users AS
SELECT CONCAT(username,'_',domain) as name,
CONCAT(username,'_',domain) as username,
CONCAT(username,'@',domain) as mailbox,
...
De tal forma que el username que Asterisk ve en la vista es:
ibc_dominio.com(a)dominio.com
Cuando llega una consulta o se deja un mensaje en un buzón de voz en
OpenSer cambio el From para que Asterisk lo identifique y genere el NOTIFY
tal que así:
NOTIFY sip:ibc_dominio.com@dominio.com SIP/2.0
y cuando ese NOTIFY llega a OpenSer cambio el RURI antes de hacer
el "lookup(location)" y lo dejo normal:
ibc(a)dominio.org
Así se elimina el problema de dos usuarios con mismo username en Asterisk
ya que si hago "sip show peers" veré:
ibc_dominio.com
ibc_otro_dominio.com
Bueno, hay una pequeña pega derivada del sistema Realtime de Asterisk:
Resulta que Asterisk sólo envía el NOTIFY MWI si el usuario está registrado
**según su lista interna**, o sea, si sale listado al hacer "sip show peers".
Si un usuario llama a Asterisk encontes Asterisk hace la consulta SQL a la
tabla (vista) de usuarios RealTime y en ese momento dicha entrada se añade a
la lista interna de usuarios (a partir de ese momento ya podría recibir MWI).
Tengo puesto las opciones "rtcachefriends=yes" y
"ignoreregexpire=yes", con lo
que el problema desaparece para un determinado usuario en cuanto éste llama a
Asterisk para lo que sea. Es decir, sólo es necesario que **cada** usuario
llame al menos una vez al Asterisk para recibir MWI.
El problema ocurre si se reinicia Asterisk (se vacía la lista interna de
usuarios).
Traté de probar un parche que se supone carga todos los usuarios del Realtime
en el aranque pero no lo logré. Tal vez me haga algún script que lance un
INVITE o un OPTIONS a Asterisk por cada usuario de OpenSer (con su From
correspondiente).
Lo malo es: si efectivamente logro que "sip show peers" muestre TODOS los
usuarios, esa información está cacheada en Asterisk, en memoria. Si son mucho
usuarios... ¿no podría ser un problema?
Saludos.
--
Iñaki Baz Castillo