Enviado por admin el
Dependiendo del escenario, necesitamos contar los canales que cada usuario/cliente está utilizando y al mismo tiempo queremos limitar ese numero de canales fijando un valor valido a nivel global. Claramente esta es solamente una forma de realizar ese tipo de configuración y seguramente la más sencilla ya que no vamos a diferenciar el numero de canales según el cliente. En este articulo veremos dos formas de hacerlo:
-
utilizando un valor que si se modifica obliga a reiniciar el Proxy SIP
-
utilizando un valor que se puede modificar utilizando el comando kamcmd y el modulo CFG_RPC
En el primer caso la configuración se realiza de la siguiente manera; se cargan los módulos DIALOG y CFG_RPG de Kamailio:
loadmodule "cfg_rpc.so"
loadmodule "dialog.so"
y entre los distintos parámetros del modulo DIALOG se añade (en negrita):
# ----- dialog params -----
modparam("dialog", "enable_stats", 1)
modparam("dialog", "rr_param", "did")
modparam("dialog", "timeout_avp", "$avp(dlg_timeout)")
modparam("dialog", "default_timeout", 21600)
modparam("dialog", "early_timeout", 300)
modparam("dialog", "noack_timeout", 30)
modparam("dialog", "end_timeout", 60)
modparam("dialog", "dlg_match_mode", 0)
modparam("dialog", "db_url", DBURL)
modparam("dialog", "db_mode", 1)
modparam("dialog", "send_bye", 1)
modparam("dialog", "profiles_with_value", "canales")
con este parámetro se dice a Kamailio que se va a crear un perfil de diálogos con nombre canales y que este perfil puede manejar valores (contar). Luego en este bloque presente en el archivo predefinido de Kamailio:
if (is_method("INVITE")) {
setflag(FLT_ACC); # do accounting
}
se añade la linea en negrita:
if (is_method("INVITE")) {
setflag(FLT_ACC); # do accounting
dlg_manage();
}
que nos permite activar el modulo DIALOG para las llamadas y de este forma a toda una serie di variables y parámetros que se pueden leer o configurar por cada dialogo. Luego en el punto que nos interesa (normalmente antes de sacar llamadas salientes):
if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;
se añade esta linea:
route(CANALES);
y normalmente al final del archivo se añade:
route[CANALES] {
set_dlg_profile("canales","$fU");
get_profile_size("canales","$fU","$avp(usados)");
if($avp(usados) > 2) {
sl_send_reply("503", "Has excedido el limite de canales");
exit;
}
}
Una explicación:
-
en la segunda linea se añade el dialogo (llamada) al perfil canales utilizando como referencia el numero de usuario contenido en la variable $fU
-
en la tercera linea se asigna a la variable $avp(usados) el valor del perfil canales para el usuario que está llamando
-
en la cuarta linea se envía la frase que aparece al LOG de Kamailio
-
en la quinta linea si el numero de canales usados por el usuario es más que 2, se continua con la linea que sigue sino se salta el bloque por completo
-
en la sexta linea se envía al LOG de Kamailio un comento notificando que se ha superado el numero de canales disponibles por el usuario contenido en la variable $fU
-
en la séptima linea se envía un mensaje de error SIP 503 indicando que se ha excedido el numero de canales disponibles
En este caso el numero máximo de canales es 2 pero podría ser cualquiera.
El segundo tipo de configuración se basa en los Parámetros Globales Personalizados que tienen la siguiente sintaxis:
group.variable = value desc "description"
si queremos configurar el numero de canales utilizando estos parámetros nada más poner en la parte del archivo de configuración dedicada a los parámetros globales:
canales.num_can = "2" desc "numero de canales"
luego el bloque anterior se modifica para que quede (en negrita los cambios):
route[CANALES] {
set_dlg_profile("canales","$fU");
get_profile_size("canales","$fU","$avp(usados)");
if($avp(usados) > $sel(cfg_get.canales.num_can)) {
sl_send_reply("503", "Has excedido el limite de canales");
exit;
}
}
Esa variable contendrá el valor 2 presente en la configuración del parámetro global personalizado. Si mientras Kamailio está funcionando queremos cambiar ese valor:
kamcmd cfg.set canales num_can nuevovalor
ejemplo para 10 canales:
kamcmd cfg.set canales num_can 10
si queremos saber en cualquier momento que valor tiene ese parámetro:
kamcmd cfg.get canales num_can
IMPORTANTE: ese valor se mantiene hasta que no se reinicie Kamailio ya que el Proxy a reiniciarse, leerá nuevamente el valor presente en el parámetro global personalizado.
Comentarios recientes