Hoola:
Sorry por mandar este mail a las 2 listas, es por si alguien todavía no se ha cambiado...
He implementado un sistema de call forward con OpenSER bajo los 3 tipicos supuestos (blind, busy y no answer). Me funciona, pero tengo una dudilla respecto a la función append_branch: según yo entiendo, lo que hace es "abir" un nuevo call leg (o algo asi) hacia el ruri indicado y luego conectarme.
Pues bien, yo lo he utilizado porque me daba error y me decia que no quedaban branches... y al ponerlo voila! La cuestion es: es esto correcto?
Por otro lado, al implementar la cosa esta me ha venido la siguiente duda:
Cuando el desvío es blind, simplemente cojo el uri que tengo almacenado en la tabla usr_preferences hago relay hacia alli, por lo que si soy yo mismo no hay problema, la llamada iria saltando y saltando hasta llegar a destino.
En cambio, el control del desvio si ocupado o si no contesta lo hago en el on_failure, y por lo tanto, no puedo hacer ese "bucle", es decir, si el usuario destino tambien se encuentra desviado, yo no lo se. Pregunta: como puedo volver a meter la llamada en el route central (con el ruri alterado) para asi poder tener un forwarding "recursivo"?
Ahora mismo lo tengo tal que asi:
# ----------------------------------------------------------------- # failure_route[1] -- Cuando falla un INVITE - 486 busy o 408 no answer, le mandamos al buzon o desviamos # -----------------------------------------------------------------
failure_route[1] { if(!t_was_cancelled()) {
if (t_check_status("(486)|(408)")) {
## Miramos si tiene el Voicemail activado if (avp_db_load("$ruri/username", "$avp(s:vm)")) { xlog("L_INFO","$Cbx--- Voicemail ACTIVADO ---$Cxx\n"); revert_uri(); rewritehostport("10.68.42.134:5070"); append_branch(); ## Activamos el flag 10 para evitar bucles xlog("L_INFO","$Cbx---> Redirigiendo al Voicemail...$Cxx\n"); setflag(10); route(1); exit; } }
## Si devuelve BUSY comprobamos su hay desvio if (isflagset(21) && t_check_status("486")) { if (avp_pushto("$ruri", "$avp(s:cfb)")) { avp_delete("$avp(s:cfb)"); resetflag(21); route(6); exit; } }
## Si devuelve NO ANSWER comprobamos su hay desvio if (isflagset(22) && t_check_status("408")) { if (avp_pushto("$ruri", "$avp(s:cfna)")) { avp_delete("$avp(s:cfna)"); resetflag(22); xlog("L_INFO","$Cbx Estoy en el failure donde noanswer $Cxx\n"); route(6); exit; } }
} }