Howto's

De VIVAitwiki
Ir a la navegaciónIr a la búsqueda
Producto: VIVAit Call

VIVAit Suite

VIVAit Fax

Sumario

1 OPERACIONES DE SISTEMAS

1.1 Como parar asterisk

En situaciones límite en el que es necesario parar el asterisk y volver a arrancarlo hay que realizar los siguientes pasos:

Entrar en la consola de asterisk e introducir el comando core stop now
Si esto no funciona, tendremos que matar el proceso a mano. Esto es, primero el safe asterisk y luego el asterisk mediante el comando 
kill -9 nºPID

Tras estos pasos, volveremos a arrancar el servicio asterisk mediante /etc/init.d/asterisk start


1.2 Como comprobar las versiones de los elementos de la plataforma

Aplicaciones

  • Botón derecho del ratón, Acerca De


Portales

  • En el Vivait-Call, en la pantalla de inicio de sesión pone el número de versión del portal.
  • Tanto en el Monitor como en el Tracker no se puede saber.


Demonios

  • Mediante el comando nc localhost <Puerto demonio>. Ejemplo:
nc localhost 1120
motorSal sis ver='03.02.00' inic='20150427 123457' alarmas=0 ultAlar='00000000000000'
motorSal gmp msj=253/256 buf=256/256 tarea=99/102
motorSal tmp uptime=12624 (0d 3h 30m 24s)
motorSal mtr mys=1 ocup=0% planif=13(0) intento=11(0)


Ejemplos puertos demonios:
  • 1111: vivait-cti
  • 1112: myAcdSuperv
  • 1113: recordNodo
  • 1114: recordCentral
  • 1115: intz-nimitz
  • 1120: motorSal
  • 1123: phoneprov-tftp


Base de datos

  • No se puede saber la versión a no ser que se comparen esquemáticos con los subidos en el redmine


1.3 Cancelación de eco en la plataforma

Comprobar que en chan_dahdi.conf estén configurados los parametros:

echocancel=yes
echocancelwhenbridged=yes
Jugar con los valores txgain y rxgain 

Si esto no es suficiente el siguiente paso sería emplear una canceladora de echo por hardware.

1.4 Generación de un Core

Un Core es la memoria de un programa.

Para generar un Core rápido con Asterisk hay que hacer lo siguiente:

   Ejecutar ps aux | grep asterisk y coger el PID del programa
   gdb /usr/sbin/asterisk [PID]
   gcore [file]


1.5 Consideraciones VIVAit Call Activo-Activo

La arquitectura de VIVAit Call permite dos alternativas en cuanto a registro de terminales se refiere, cuando disponemos de más de un nodo de registro:


  • Registro centralizado: Todos los terminales se registran en un único nodo, quedando el resto de nodos con funcionalidades de registro alternativo y/o gateway; en este modo de funcionamiento tenemos como principal ventaja que todas las funcionalidades están disponibles para todos los terminales, y como desventaja que el nodo de registro soporta más carga en el sistema que otros (no hay balanceo de carga en registro)
  • Registro distibuido: Los terminales distribuyen su registro entre más de un nodo; en esta arquitectura tenemos como principal ventaja una mayor distribución de la carga de registro de terminales, y como desventaja una cierta pérdida de funcionales; determinadas funcionalidades tales como:
    • Grupos (De salto, de captura, de centralita, ACD...)
    • Retrollamada: solo podrán configurarse entre terminales registrados en el mismo nodo; esto es especialmente sensible con la funcionalidad de retrollamada, que es de uso global (no así los grupos, que pueden configurarse de manera adecuada para que esta limitación no sea problema)


1.6 Conexion de terminales a VIVAit mediante OpenVPN

Conexion de terminales a VIVAit mediante OpenVPN


1.7 Generación de llamada automática

Para activar la funcionalidad es necesario lo siguiente:

  • Definir una variable ID_LISTA_LLAMAME con el ID de la lista que se va a usar para generar la llamada. Cuando se cree la lista hay que asegurarse que el campo "Nº segundos límite" tiene un valor lo suficientemente amplio para evitar que la llamada caduque antes de ejecutarse.
  • Establecer un timeout para la cola (en el Gosub Cen_Sub_GrupoACD se indica justo después de ${COLA})
  • Llamar a la función de MySQL ACD_FUNC_LLAMAME_CREAR a través de MDintz
  • En la función se usan los siguientes elementos variables:
       ${ID_LISTA_LLAMAME}: Definida antes clienteTOCola: 
       Nombre del cliente. Al no tener ningún nombre, se usa un denominador genérico
       ${CALLERID}: Número llamante, donde se dirigirá la llamada.

Ejemplo:

[Cen_VDN_99001]
;----------------------------------------------------------------------------------------------------------------
;----------------------- VDN 99001 ------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------
exten => _X.,1,NoOp(MDENTGW_99001*****EXTEN=${EXTEN}**CID=${CALLERID(NUM)}**UCID=${UCID}*)
 same =>     n,Set(__COLA=89001)
 same =>     n,Set(ctiDiriTrato=0)
 same =>     n,Set(ctiDiriInterface=)
 same =>     n,Set(ID_LISTA_LLAMAME=2)
 same =>     n(cola),Gosub(Cen_Sub_GrupoACD,${EXTEN},1(${COLA},10,,Si,))
 same =>     n,GotoIf($["${QUEUESTATUS}"!="TIMEOUT"]?colgar)
 same =>     n,MDintz(nimitz|bd|sqlDato|select ACD_FUNC_LLAMAME_CREAR(CURRENT_TIMESTAMP\,${ID_LISTA_LLAMAME}\,""\,"clienteTOCola"\,""\,""\,""\,""\,""\,""\,""\,""\,1\,""\,"${CALLERID(NUM)}"\,1\,3\,1\,""\,0\,0\,0\,""\,""\,""\,""))
 same =>     n,GotoIf($["${MDintzRes}"="OK"]?colgar)
 same =>     n,NoOp(ACD_FUNC_LLAMAME_CREAR ${MDintzRes})
 same =>     n(colgar),Hangup

1.8 Instalación de ActivaSTP con VIVAit Call 3 y marcación desde Outlook

Instalamos ActivaSTP desde:

(http://activa.sourceforge.net/)


La configuración necesaria se muestra en la siguiente imagen:

Ventana ActivaTSP.jpg

El usuario del manager debe tener permisos originate para poder realizar llamadas.

Se han realizado pruebas con Outlook 2013.

Se ha comprobado la correcta realización de pruebas utilizando ActivaSTP, realizadon llamadas desde la pestaña "personas" con la vista en modo tarjeta de Pesentación, tarjeta, teléfono o lista.

Outlook 2013 no da la opción de llamar si la vista está en modo personas.


1.9 Envío de variables CTI al ACD ante un GW con asterisk 13

Dado que para un GW con asterisk 13 un nodo ACD es considerado un elemento externo, por defecto, no se envían variables CTI (UCID, ...). En una fututa versión del nodo ACD, ya no se considerará un elemento externo por lo que si se enviarán dichas variables. Para lograrlo en la versión 3.0 de la plataforma Vivait hay que modificar el fichero ext_MARCAR_Externo_Particular.conf del GW. Deberemos poner la siguiente linea.

same => n,Macro(escribirDatosCti)


1.10 Como volver a procesar grabaciones con error

Las grabaciones con error son aquellas que tienen el valor E_GRABACION=120 en la tabla DAT_GRABACIONES.

Las grabaciones con error se producen normalmente por la pérdida de conexión entre el nodo servidor de grabaciones y el resto.

Para reprocesar la grabación hay que modificar el campo E_GRABACION de la tabla DAT_GRABACIONES y ponerlo con valor 20 para que así el recordCentral la vuelva a procesar.


1.11 Como ver los directorios de un NAS a montar con NFS

Con el siguiente comando vemos los diferentes volúmenes de un NAS:

showmount -e IP_NAS

Ejemplo de salida:

Export list for 192.168.10.10:
/Backup/backup       *
/DISCOS_1/VOL1_AUDIO *


1.12 Simple_bridge y native_rtp

Para ver en que modo de funcionamiento está la llamada escribiremos el siguiente comando.

homologacion-corp0*CLI> bridge show all

 Bridge-ID                            Chans Type            Technology
 b40f41e3-0028-46d4-8c7c-34999090680f     2 basic           native_rtp

El simple_bridge es el peor funcionamiento posible en el asterisk, hay que intentar estar siempre en native_rtp.

El native_rtp tiene dos modos de funcionamiento que se ve al ejecutar el comando siguiente:

 homologacion-corp0*CLI> sip show channel 6d7c7a13176fc340180528281d4bcc3a@172.25.128.91:5060
 Audio IP:               172.25.129.102 (Outside bridge)

En el campo Audio Bridge podemos ver el valor Local o Outside bridge. En el modo local no se maneja el audio por lo que no hay RTP directo entre teléfonos y pasa a través del asterisk, mientras que en modo Outside bridge si que hay rtp directo.


1.13 Como "dar paso" a través de un enlace exterior si hay una llamada para una extensión creada en el sistema pero no registrada

Este procedimiento es de utilidad en procesos de migración, en los que recibimos las llamadas de la RTC, nos las quedamos si la extensión ya está registrada en VIVAit y la mandamos hacia la plataforma a migrar si aún sigue migrada ahí

El procedimiento es:

  • Activar desvío por no contesta en la extensión (portal de administración - VIVAit Call - Dispositivos - Extensiones - campo "Desvio no contesta", indicando como destino un prefijo (por ejemplo "99") seguido de la extensión destino
  • Creamos una preruta en vivait-call - rutas -prerutas con origen "99", le quitamos el prefijo en campo "Destino saliente 1" (valor -2) e indicamos en campo "Tipo destino sal. 1" como "Ruta externa"
  • Debera existir una ruta externa para esa numeración


1.14 Como se muestra el número llamante en transferencia desde operadora

Para tener el número ANI en las transferencias con consulta hay que realizar lo siguiente:

Copiar el archivo adjunto (app_esConsulta.c) en el directorio apps de Asterisk (normalmente /usr/src/vivait-call/asterisk/apps).
   Situarse en el directorio raiz de Asterisk (normalmente /usr/src/vivait-call/asterisk/).
   Compilar: make
   Instalar: make install
   Habilitar el nuevo módulo: asterisk -rx 'module load app_esConsulta.so'
   Si la carga del módulo no funcionara, hay que el reiniciar Asterisk para que cargue el módulo.

Posteriormente modificar el fichero ext_Enrutador_Particular.conf de la siguiente forma:

[Cen_Enrutador_Particular]
exten => [*#%0-9].,1,NoOp(MDENRUPAR**EXTEN=${EXTEN}**CID=${CALLERID(NUM)}*)
same =>           n,NoOp(calleridAntes=${CALLERID(num)})
same =>           n,esConsulta
same =>           n,GotoIf($["${consultaANI}"=""]?noConsulta)
;same =>           n,Set(CALLERID(name)=\Transfer:${consultaANI}\)
same =>            n,Set(_R_CID_NUM_00=${consultaANI})
same =>           n,GotoIf($["${consultaNOM}"=""]?noNom)
;same =>           n,Set(CALLERID(name)=\Transfer:${consultaNOM}\)
same =>            n,Set(_R_CID_NAME_00=${consultaNOM})
same =>           n(noNom),Set(_R_CID_NUM_00=${consultaANI})
same =>           n,NoOp(callerIDdespues=${CALLERID(num)})
same =>           n(noConsulta),NoOP(noConsulta)
;same =>           n,Set(CALLERID(num)=${consultaANI})
same =>            n,Return

En caso de que ya haya algo añadido en el fichero, hay que analizar en que posición se pondrá el contenido anterior para que no se vea modificado el funcionamiento de la centralita


1.15 Como crear una facilidad que anule todos los desvíos que una extensión tenga configurados en la centralita con la excepción del desvío "Fuera de servicio"

[Cen_Facilidad_XXXX]

exten => _[*#%0-9a-zA-Z].,1,NoOp(MDSER_desvExtenDesac)
same => n,MDintz(nimitz|bd|sqlSinEspera|update CEN_EXTENSIONES set C_DESVIO_INCONDICIONAL="",
B_DESVIO_INCONDICIONAL_MENSA=0, C_DESVIO_NC="", B_DESVIO_NC_MENSA=0, C_DESVIO_OCUPADO="", B_DESVIO_OCUPADO_MENSA=0 where ID=${ENR_ORIGEN})

same => n,GotoIf($["${MDintzRes}"="OK"]?:error)
same => n,Playback(DESVIOS_DESACTIVADOS) //REQUIERE GRABACION
same => n,Return(0)
same => n(error),Playback(vm-opeMal)
same => n,Return(0)

include => Cen_finLlamada


1.16 Como solucionar problemas de deslogado de un agente en los grupos de salto

El problema viene del procedimiento almacenado en base de datos CEN_FUNC_LISTA_COLAS()

El campo VAR_NOMBRE es muy pequeño y no caben todas las colas configuradas (12).

Se ha creado la siguiente funcionalidad:


[Cen_Facilidad_240]

exten => _[*#%0-9a-zA-Z].,1,NoOp(MDSER_logoutAgente)
;same => n,GoSub(Cen_Sub_getListaColas,s,1)
;same => n,GotoIf($["${sqlDato}"=""]?no_colas)
;same => n,Set(ListaColas=${sqlDato})
;same => n,Set(sep=\;)
same => n,Set(offset=0)

same => n(bucleCola),NoOp(OFFSET=${offset})
same => n,GoSub(Cen_Sub_getColasCentralita,s,1(${offset}))
same => n,Set(nomCola=${GOSUB_RETVAL})

same => n,GotoIf($["${nomCola}"=""]?finLoginInterface) 

same => n,RemoveQueueMember(${nomCola})
same => n,Goto(siguienteCola)

same => n(siguienteCola),Set(offset=$[${offset} + 1])
same => n,Goto(bucleCola)

same => n(finLoginInterface),NoOp
same => n,Playback(agent-loggedoff)
same => n,Return(0)

include => Cen_finLlamada

;-----------------------------------------------------------------
[Cen_Sub_getColasCentralita]
;-----------------------------------------------------------------
;-----------------------------------------------------------------

; ${ARG1}: Valor OFFSET

exten => s,1,NoOp(MDSUBGETCOLACENTRA*)

same => n,ExecIf($["${SPRV}"="1"]?Return(SUPERVIVENCIA))

same => n,Set(sqlDato=)
same => n,Set(vacio=)

same => n,MDintz(nimitz|bd|sqlDato|select C_NOMBRE from nimitz.CEN_COLAS order by ID asc limit 1 offset ${ARG1})

same => n,ExecIf($["${MDintzRes}"!="OK"]?Return(${vacio}))

same => n,Return(${sqlDato})

include => Cen_finLlamada


1.17 Como solucionar que cuando las llamadas entran por el GW los desvios por no contesta no actúan

Se ha encontrado una solución a través de dialplan.

Se va a realizar el tratamiento en contextos particulares y solo en el GW.

En el fichero "ext_MARCAR_Extension_Particular.conf" crearemos los siguientes contextos:

[Cen_MARCAR_Extension_Dial_Particular]

exten => _[*#%0-9].,1,NoOp(MDMAREXTENDIALPAR)
same => n,Set(HDIAL=${EPOCH})
same => n,Return(OK)
include => Cen_finLlamada

[Cen_MARCAR_Extension_PostDial_Particular]

exten => _[*#%0-9].,1,NoOp(MDMAREXTENPOSTDIALPAR)
same => n,Set(SEGDIAL=$[${EPOCH}-${HDIAL}])
same =>   n,ExecIf($[${SEGDIAL} > 8]?Set(DIALSTATUS=NOANSWER))
same => n,Return(OK)
include => Cen_finLlamada

Si tenemos una versión antigua y no está el include de este fichero lo pondremos en el ext_MARCAR_Extension.conf:

#include "ext_MARCAR_Extension_Particular.conf"

De igual modo si tenemos una versión antigua hay que llamar a los contextos creados anteriormente desde el dialplan. En concreto desde el [Cen_Marcar_Extension_Dial]

same =>  n,Set(__PICKUPMARK=${R_DEST_${ENR_RUTA_CAD}})
; Este es el contexto para hacer ajustes antes del Dial
; Tambien podemos cancelar la llamada con los retornos (OCUPADO-CANCELAR-NO_DISPONIBLE)
; el contexto es Cen_MARCAR_Extension_Dial_Particular es general para todos los enlaces externos
; Deberia ir en el fichero Ext_MARCAR_Extension_Particular.conf
same =>  n,Set(GOSUB_RETVAL=)
same =>  n,GosubIf($[${DIALPLAN_EXISTS(Cen_MARCAR_Extension_Dial_Particular,${EXTEN},1)}>0]?Cen_MARCAR_Extension_Dial_Particular,${EXTEN},1)
same =>  n,GotoIf($["${GOSUB_RETVAL}"="OCUPADO"]?%-BUSY,1)
same =>  n,GotoIf($["${GOSUB_RETVAL}"="CANCELAR"]?%-CANCEL,1)
same =>  n,GotoIf($["${GOSUB_RETVAL}"="NO_DISPONIBLE"]?%-CHANUNAVAIL,1)
same =>  n(dial),NoOp
same =>  n,Set(CAUSA_COLGADO=)
same =>  n,Dial(${ENR_CADMARCAR},40,eU(Cen_Marcar_Extension_Dial_Gosub,s,1))
same =>  n,NoOp(MDMAREXTENDIALRES**CadMarcar=${ENR_CADMARCAR}**DIALSTATUS=${DIALSTATUS}**CID=${CALLERID(num)}*)
same =>  n,GosubIf($[${DIALPLAN_EXISTS(Cen_MARCAR_Extension_PostDial_Particular,${EXTEN}, 1)}>0]?Cen_MARCAR_Extension_PostDial_Particular,${EXTEN},1(${DIALSTATUS}))
same =>  n,NoOp(MDMARsST**CadMarcarSub=${Enr_CadMar}**DIALSTATUS=${DIALSTATUS}**CID=${CALLERID(num)}*)
same =>  n,Goto(%-${DIALSTATUS},1)


1.18 Como insertar y/o actualizar más de 100 locuciones utilizando el portal de administración

Al subir la locución id 100 a través del portal se produce un erro al sincronizar:

Error stream: cp:cannot stat '/var/lib/MDtel/locuciones/00000XX/0000100_t2607.wav' : No such file or directory

Además la locución no se guarda en /var/lib/MDtel/locuciones/00000XX.


Se modifica la operativa de inserción y actualización de locuciones desde el portal.

El proceso, teniendo en cuenta el id del registro insertado, establecerá el nombre de la carpeta mediante una división entera del id entre 100, de esta manera cada carpeta tendrá un máximo de 100 locuciones:


  • 0-99 carpeta 0000000
  • 100-199 carpeta 0000001
  • 200-299 carpeta 0000002

El nombre de archivo irá de 0000000_ a 0000099_ y se obtendrá mediante el operador mod de 100 aplicado al id.

Las carpetas donde se generan las locuciones en el servidor del portal se generan según el ID de la locución:

Integer.parseInt(rs.getString("ID"))/ 100

Se cambia el generaConf para que lea estas carpetas.

Ir arriba


1.19 Funcionamiento de SerCen con nat en versión 3.6 de VIVAit

Se desarrolla una librería para mantener las conexiones tcp activas

Esta librería va en la ruta /usr/lib/


Hay que modificar el script de arranque del SerCen (/etc/init.d/serCen) y añadir la línea

echo "Starting $PROJECT"
ulimit -c unlimited
export LD_PRELOAD=libtcpnat30.so
start-stop-daemon --start --pidfile $PIDFILE --chuid $USER:$GROUP --exec $CMD

Parar y arrancar SerCen.

Esto lo que hace es que cada 30 segundos se mande un paquete al mysql.

Ejemplo:

11:13:08.685037 IP 172.25.128.253.43760 > 172.25.128.94.3306: Flags [.], ack 1375642683, win 251, options [nop,nop,TS val 2775412379 ecr 1937271814], length 0
11:13:08.685692 IP 172.25.128.94.3306 > 172.25.128.253.43760: Flags [.], ack 1, win 501, options [nop,nop,TS val 1937301855 ecr 2775382339], length 0

2 CONFIGURACIONES

2.1 043 ERROR Permisos MySQL:180 - Error SQL

En el portal de administración no se visualizan los permisos de usuario (pestaña General - Usuarios - Permisos de usuarios.

Puede pasar en instalaciones en las que el Sistema Operativo es Ubuntu 16

Cuando se busca, da el error en el catalina.

Se soluciona cambiando el fichero PermisosMySQL.class en el directorio /var/lib/tomcat8/webapps/Vivait-Call/WEB-INF/classes/com/mdtel/nimitz/vivaitcall/dao

Después hay que reiniciar tomcat.

2.2 Error cuando exportamos contactos con un script

En la versión 5.7. de MySQL la opcion secure_file_priv viene activada por defecto.

Si utilizamos un script para exportar contactos, es posible que dé error al no poder escribir el fichero con el resultado.

La solución es mover éste fichero en el que esbribimos el resultado de la select al al directorio que te da la variable secure_file_priv

mysql> SHOW VARIABLES LIKE "secure_file_priv";
Variable_name  Value 
secure_file_priv  /var/lib/mysql-files/

2.3 Como configurar la megafonía

El servicio de megafonía se basa en el protocolo multicast.

Para configurar la megafonía tenemos que activar en los teléfonos que para que estén "escuchando" en una dirección multicast y tener un emisor en esa dirección multicast.

Los teléfonos suelen tener en su configuración un apartado para configurar el multicast. Por ejemplo en los yealink está en la pestaña directory sección multicast IP.

En los teléfonos se puede configurar manualmente o incluirlo en las plantillas de aprovisionamiento.

El asterisk tiene un canal para hacer multicast. Este canal es MulticastRTP.

Para esto podemos crear un VDN que contenga la siguiente línea. (en el ejemplo la dirección multicast es 239.0.126.1 y el puerto es el 10001).

[Cen_VDN_90000]
exten => _X.,1,NoOp(MDVDN_90000*****EXTEN=${EXTEN}**CID=${CALLERID(NUM)}**UCID=${UCID}*)
 same =>     n,Answer
 same =>     n,Dial(MulticastRTP/basic/239.0.126.1:10001)
include => Cen_finLlamada

2.4 Como configurar el candado

El candado permite prohibir temporalmente la posibilidad de realizar llamadas hacia fuera. Sí se pueden seguir haciendo llamadas a extensiones fijas de la plataforma, es decir, llamadas sin coste.

Para configurar dicha funcionalidad basta con crear extensiones con la categoría mas restrictiva posible y habilitar la movilidad, con lo que la extensión solo tendrá "permisos" para realizar llamadas internas.

Para permitir llamadas externas solo hay que "mover" a un usuario con categoría suficiente a la extensión deseada.


2.5 Como configurar los portales web en HTTPS

Desde /usr/lib/jvm/default-java/bin/ ejecutamos:

keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/share/tomcat7/.keystore

Escriba la contraseña del almacén de claves: (t0mc4t)

Volver a escribir la contraseña nueva: (t0mc4t)
*Personalizar para el cliente
¿Cuáles son su nombre y su apellido?
[Unknown]: VIVAit Suite
¿Cuál es el nombre de su unidad de organización?
[Unknown]: Desarrollo
¿Cuál es el nombre de su organización?
[Unknown]: MDtel
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]: Madrid
¿Cuál es el nombre de su estado o provincia?
[Unknown]: Madrid
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]: es
¿Es correcto CN=VIVAit Suite, OU=Desarrollo, O=MDtel, L=es, ST=Madrid,
C=Unknown?
[no]: si
Escriba la contraseña clave para <tomcat>
(INTRO si es la misma contraseña que la del almacén de claves)

nano /var/lib/tomcat7/conf/server.xml

Descomentar la línea:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"/>

Añadir después de sslProtocol="TLS":

keystorePass="t0mc4t"


2.6 Actualización de vmware_tools en los sistema Asterisk

Resuelve problemas existentes desde la puesta en marcha de los sistema clasterizados con el efecto freezing que sufren los equipos cuando se ejecuta la aplicación vmbackup para realizar las copias de seguridad.

Para instalar las open-vm-tools en ubuntu nos descargaremos el .tar.gz

Instalamos las siguientes librerías para la compilación:

libmspack, libglib2.0-dev , libpam0g-dev, libxerces-c2-dev, libxmlsec1-dev, xml-security-c-utils, libxml-security-c-dev, libx11-dev, libxext-dev, libxinerama-dev, libxi-dev, libxrender-dev, libxrandr-dev, libxtst-dev, libgtk2.0-dev, libgtkmm-2.4-dev, libprocps3-dev, libdnet, libdumbnet-dev, libnotify-dev

Luego ejecutaremos:

autoreconf -i
./configure --without-kernel-modules
make
make install
ldconfig

Los script se instalan en /usr/local/bin

Para saber la versión se ejecuta

vmware-toolbox-cmd -v

Para arrancarlo solo hay que hacer un script:

#!/bin/sh
### BEGIN INIT INFO
# Provides: open-vm-tools
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# X-Start-Before:
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Runs the open-vm-tools services
# Short-Description: Runs the open-vm-tools services
### END INIT INFO
. /lib/lsb/init-functions
exit_if_not_in_vm () {
if [ ! -x /usr/local/bin/vmware-checkvm ] || !
/usr/local/bin/vmware-checkvm > /dev/null 2>&1
then
echo "open-vm-tools: not starting as this is not a VMware VM"
exit 0
fi
}
case "${1}" in
start)
# Check if we're running inside VMWare
exit_if_not_in_vm
log_daemon_msg "Starting open-vm daemon" "vmtoolsd"
start-stop-daemon --start --quiet --pidfile
/var/run/vmtoolsd.pid --exec /usr/local/bin/vmtoolsd --test > /dev/null || exit
1
start-stop-daemon --start --quiet --pidfile
/var/run/vmtoolsd.pid --exec /usr/local/bin/vmtoolsd -- --background
/var/run/vmtoolsd.pid || exit 2
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping open-vm guest daemon" "vmtoolsd"
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5
--pidfile /var/run/vmtoolsd.pid --exec /usr/local/bin/vmtoolsd
RETURN="${?}"
[ "${RETURN}" = 2 ] && exit 2
# Many daemons don't delete their pidfiles when they exit.
rm -f /var/run/vmtoolsd.pid
log_end_msg 0
;;
force-reload|restart)
${0} stop
${0} start
;;
*)
log_success_msg "Usage: ${0} {start|stop|restart|force-reload}"
exit 1
;;
esac

ésta debe ubicarse en /etc/init.d/ y tener permisos de ejecución.

Tras hacer esto ejecutar el siguiente comando:

update-rc.d open-vm-tools defaults 91

Debe arrancar ejecutando:

/etc/init.d/open-vm-tools start

2.7 Como configurar servicio DHCP en Ubuntu Linux

¿Que es un servicio DHCP?

Un servidor Dynamic Host Configuration Protocol (DHCP) asigna dinámicamente las direcciones IP y otras configuraciones de red a otros terminales que están conectados a la red.

Instalar un servicio DHCP

Para instalar el servidor de asignacion automatica de direccion IP ejecutamos el comando:

sudo apt-get install isc-dhcp-server

Configurando el servicio DHCP

Editamos el archivo /etc/dhcp/dhcpd.conf creando primero un backup del mismo:

mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.original
nano /etc/dhcp/dhcpd.conf

El archivo debe quedar de una forma muy similar a esta:

authoritative
subnet  10.254.239.0 netmask 255.255.255.254
{
range dynamic-bootp  10.254.239.40 10.254.239.60;
option domain-name-servers ns1.example.org, ns2.example.org;
option domain-name "example.org";
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org ;
option broadcast-address 10.254.239.255;
default-lease-time 3600;
max-lease-time 7200;
option option-150 10.254.239.25
}

Donde los campos:

  • subnet: Direccion de red
  • netmask: Máscara de red
  • range dynamic-bootp: Rango de IPs que va a proporcionar el DHCP
  • option domain-name-servers: Direcciones IPs de los DNS
  • option domain-name: Nombre de dominio
  • option routers:IPs de las puertas de enlace
  • option broadcast-address: Dirección de broadcast
  • default-lease-time: Tiempo de concesión por defecto
  • max-lease-time: Valor máximo del tiempo de concesión
  • option option-150: IPs de los servidores TFTPs que tiene la red

Reiniciamos el servicio

service isc-dhcp-server restart

Direcciones IP estáticas basadas en la MAC

Pueden conocerse las MAC de las máquinas conectadas a la red ejecutando el comando arp desde la terminal.

host ejemplo {
       hardware ethernet 00:0B:82:19:A8:04;
       option option-150 10.254.239.0;
#      fixed-address 10.254.239.52;
}


2.8 Como configurar el "parking" de llamadas por parte de la operadora

Para que una llamada se pueda "aparcar" hay que añadir la opcion k en el Dial, por lo tanto solo se pueden aparcar llamadas que se hagan mediante dial no por queue.

ext_MARCAR_Extension_Dial.conf: same => n,Dial(${ENR_CADMARCAR},40,keU(Cen_Marcar_Extension_Dial_Gosub,s,1))

Despues configuramos el slot de parking y las diferentes "extensiones virtuales" donde se aparcarán las llamadas. Ese fichero es el res_parking.conf que tiene las siguientes opciones configuradas:

[general]
[default] ; Default Parking Lot
parkext => 700
parkpos => 701-710
context => parkedcalls
parkingtime => 300
findslot => first

Para crear un hint para monitorizar en que "extensiones virtuales" hay llamadas aparcadas pondremos lo siguiente en el fichero ext_Subscribe.conf

include => parkedcalls
exten => 701,hint,park:701@parkedcalls

EJEMPLO: Utilizamos un terminal grandstream con extensión 43002 como operadora. Se ha creado un hint monitorizando la extensión virtual 701 y un speed dial al VDN 91000, donde se realiza el parking al slot default.

A nivel de enrutamiento se crea una pre-ruta con destino 701 que acabe en un VDN corporativo 91001, donde se recupera la llamada "aparcada" en la "extensión virtual" 701.

Se crea en base de datos la facilidad de Parking '7270', 'TTipoFacilidad', 'Parking', '700', 'Parking de llamadas'

Y se crea desde el portal el codigo *70# para llamar a la facilidad. Se modifica el fichero ext_Marcar_Facilidad_nimitz.conf para añadir la facilidad de Parking. Se crean dos nuevos BLFs mas para las "extensiones virtuales" 702 y 703.

2.9 Como configurar que los tonos dtmf no sean regenerados por Asterisk

Para que los tonos dtmf no sean regenerados por Asterisk hay que:

cd /usr/src/MDtel/asterisk/apps/
cp /tmp/app_setoption.c .
ls -l app_setoption.c
cd ..
make menuconfig (comprobar que todo está bien)
make (comprobar que compila la nueva app)
make install


EJEMPLO: los tonos dtmf entran por "Trunk_GW_MAQUETAS" y va a la extensión 4175.

Creamos un nuevo contexto por el trunk de entrada que queremos activar esta opción (o lo aplicamos a todos si procede, dependerá de cada instalación)

PARA LA ENTRADA:

   sip_trunkExt_WEB.conf
       Trunk_GW_MAQUETAS
           context=Cen_Inicio_TrunkSip_Maqueta
           dtmfmode=inband
           directmedia=no
           disallow=all
           allow=alaw
   ext_InicioLlamada_TrunkSIP_Particular.conf
       [Cen_Inicio_TrunkSip_Maqueta]
           exten => _X.,1,NoOp(MDINITRUNSIPPAR**EXTEN=${EXTEN}**CID=${CALLERID(NUM)}*)
           same =>            n,SetChannelOption(14,0)
           same =>            n,Goto(Cen_Inicio_TrunkSip,${EXTEN},1)
           same =>            n,Return()
           

PARA LA SALIDA:

   ext_MARCAR_Extension_Dial.conf
       [Cen_Marcar_Extension_Dial_Gosub]
            same =>  n,ExecIf($["${PASARTONOS}"="1"]?SetChannelOption(14,0))    (AÑADIMOS)
            
    sip_WEB.conf
       El peer debe tener:
           PASARTONOS => 1     ;Variable declarada para el contexto ext_MARCAR_Externo_Dial en la macro
           dtmfmode=inband
           directmedia=no
           disallow=all
           allow=alaw
            

Paramos y arrancamos Asterisk (ya que hemos compilado y aprovechamos para recargar DialPlan)

Para comprobar el funcionamiento:

En Asterisk:

   core set debug 1
       Hacer llamada descolgando la misma
   core set debug 0

Revisar el log de Asterisk y comprobar que en ambos canales de la llamada aparece "Disabling digit detection" (si no aparece, algo falta por configurar):

   chan_sip.c: Disabling digit detection on SIP/4175-00000031
   chan_sip.c: Disabling digit detection on SIP/Trunk_GW_MAQUETAS-00000030


2.10 Como configurar protocolo Skinny en VIVAit Call mediante uso de Chan-SCCP

Instalación de chan_sccp

  • Copiar el fichero chan-sccp-4.2.1.1.tar.gz en el directorio donde estén los fuentes de Asterisk (normalmente /usr/src/MDtel)
  • Descomprimir
  • Entrar al directorio chan-sccp-4.2.1.1
  • Ejecutar: ./configure --with-asterisk=../DIRECTORIO_ASTERISK --enable-conference. Donde DIRECTORIO_ASTERISK es el nombre del directorio donde están los fuentes de asterisk.
  • Tras ejecutar el configure (si todo va bien al final se verá un resumen con el S.O, arquitectura, etc), ejecutar make y make install
  • El nuevo módulo chan_sccp.so se generará dentro del DIRECTORIO_ASTERISK en lib/asterisk/modules/ y se deberá copiar en /usr/lib/asterisk/modules/
  • Copiar el fichero sccp.conf a /etc/asterisk
  • Entra a Asterisk y ejecutar: module load chan_sccp.so
  • Si se ha cargado correctamente, desde dentro de Asterisk, si se teclea sccp show version deberá devolver: "Skinny Client Control Protocol (SCCP). Release: 4.3.0 4.3.0 - unknown (built by 'root' on '2016-06-01 10:42:32 UTC')"

Crear extensiones

  • En el portal crear una nueva clase de dispositivo (Vivait-Call/Dispositivos/Clases de dispositivos), donde la clase sea extensión la subclase H323 (todavía no existe la subclase SCCP) y el formato SCCP/${DEST}
  • Crear la nueva extensión, pero el dispositivo debe ser el creado en el campo anterior.
  • Las extensiones creadas habrá que añadirlas al fichero sccp.conf así como los teléfonos que las usarán. En el fichero sccp.conf incluido hay ejemplos.

Aprovisionamiento Los terminales se aprovisionan de la misma manera que los SIP, exceptuando que las plantillas XML no tiene referencias a SIP. Se incluye un xml genérico con todas las opciones. Dentro del directorio chan-sccp-4.2.1.1 hay un directorio conf con todos los archivos de configuración necesarios. Las versiones annotated contienen todas las opciones posibles comentadas.

2.11 Como crear un grupo de captura y que se vea en cada teléfono el número que llama

ATENCIÓN: SE CREAN CONFIGURACIONES NO REFLEJADAS EN PORTAL DE ADMINISTRACIÓN

Para la simulación de grupos de captura y conseguir que todos los terminales vean el ANI del llamante:

- Hacen falta teléfonos con dos líneas

- Cada teléfono del grupo tiene en la línea 1 su extensión habitual (por ejemplo 40000)

- Además, en el fichero "sip_Estatico.conf", creamos una segunda extensión para cada teléfono, que le ocupará la segunda línea (por ejemplo 42000)

- En esta segunda linea ponemos que cuando se llame tenga otro tono de llamada (un beep o nada...) que se asemeje en funcionamiento al de un mensaje de llamada en otra extension de mi grupo de captura

- Se ha creado una variable global por cada teléfono en el fichero de variables "ext_MDtel_Particular.conf" de nombre EXTxxxxx (por ejemplo EXT40000); esa variable contiene las otras extensiones virtuales del grupo por ejemplo EXT40000=>SIP/42001&SIP/42005

- Hemos creado en el dialplan programación para que cuando exista esa variable global se añada a la marcación el contenido


2.12 Instalación y configuración Postfix en RedHat7

Postfix es un servidor de correo de software libre/código abierto, un programa informático para el enrutamiento y envío de correo electrónico.

Instalación

yum install postfix

Configuración

Sobre la configuración de postfix por defecto (recién instalado): Editar el fichero /etc/postfix/main.cf

inet_protocols = ipv4
relayhost = smtp.renfe.es

Revisar la configuración:

postfix check

Configurar postfix como servicio (sólo en redhat y similares)

chkconfig postfix on

Iniciar postfix:

service postfix start

Instalar mailx para disponer de los comandos mail y sendmail:

yum install mailx

Probar configuración:

echo "Prueba de correo" | mail -vs "Prueba" correo@destino.soy


2.13 Como realizar una ampliación de disco duro en un entorno virtual

La máquina debe estar montada con discos duros "lvm", esto permite ampliar el disco duro sin necesidad de crear un segundo disco.

Se puede hacer de dos maneras:

  • Ampliar el disco existente
  • Se hace un segundo disco que añadimos al volumen lógico --> Consideramos que es el camino más lógico.

El procedimiento es el siguiente:


Detect the new disk space

Once the physical disk has been increased at the hardware level, we need to get into the operating system and create a new partition that makes use of this space to proceed.

Before we can do this we need to check that the new unallocated disk space is detected by the server, you can use “fdisk -l” to list the primary disk. You will most likely see that the disk space is still showing as the same original size, at this point you can either reboot the server and it will detect the changes on boot or you can rescan your devices to avoid rebooting by running the below command. Note you may need to change host0 depending on your setup.


echo "- - -" > /sys/class/scsi_host/host0/scan

Below is an image after performing this and confirming that the new space is displaying.

7154.jpg


Partition the new disk space

As outlined in my previous images the disk in my example that I am working with is /dev/sda, so we use fdisk to create a new primary partition to make use of the new expanded disk space. Note that we do not have 4 primary partitions already in place, making this method possible.

fdisk /dev/sda

We are now using fdisk to create a new partition, the inputs I have entered in are shown below in bold. Note that you can press ‘m’ to get a full listing of the fdisk commands.

‘n’ was selected for adding a new partition.


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): n

‘p’ is then selected as we are making a primary partition.


Command action
  l   logical (5 or over)
  p   primary partition (1-4)
p

As I already have /dev/sda1 and /dev/sda2 as shown in previous images, I have gone with using ‘3’ for this new partition which will be created as /dev/sda3

Partition number (1-4): 3

We just press enter twice above as by default the first and last cylinders of the unallocated space should be correct. After this the partition is then ready.


First cylinder (2611-3916, default 2611): "enter"
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-3916, default 3916): "enter"
Using default value 3916

‘t’ is selected to change to a partition’s system ID, in this case we change to ‘3’ which is the one we just created.


Command (m for help): t
Partition number (1-5): 3

The hex code ‘8e’ was entered as this is the code for a Linux LVM which is what we want this partition to be, as we will be joining it with the original /dev/sda5 Linux LVM.

Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)

‘w’ is used to write the table to disk and exit, basically all the changes that have been done will be saved and then you will be exited from fdisk.


Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

You will see a warning which basically means in order to use the new table with the changes a system reboot is required. If you can not see the new partition using “fdisk -l” you may be able to run “partprobe -s” to rescan the partitions. In my test I did not require either of those things at this stage (I do a reboot later on), straight after pressing ‘w’ in fdisk I was able to see the new /dev/sda3 partition of my 10gb of space as displayed in the below image.

For CentOS/RHEL run a “partx -a /dev/sda3” to avoid rebooting later on.

581.jpg


That’s all for partitioning, we now have a new partition which is making use of the previously unallocated disk space from the increase in VMware.

Increasing the logical volume

We use the pvcreate command which creates a physical volume for later use by the logical volume manager (LVM). In this case the physical volume will be our new /dev/sda3 partition.


root@Mega:~# pvcreate /dev/sda3
  Device /dev/sda3 not found (or ignored by filtering).

In order to get around this you can either reboot, or use partprobe/partx as previously mentioned to avoid a reboot, as in this instance the disk does not appear to be there correctly despite showing in “fdisk -l”. After a reboot or partprobe/partx use the same command which will succeed.


root@Mega:~# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created

Next we need to confirm the name of the current volume group using the vgdisplay command. The name will vary depending on your setup, for me it is the name of my test server. vgdisplay provides lots of information on the volume group, I have only shown the name and the current size of it for this example.


root@Mega:~# vgdisplay
  --- Volume group ---
  VG Name               Mega
...
VG Size               19.76 GiB

Now we extend the ‘Mega’ volume group by adding in the physical volume of /dev/sda3 which we created using the pvcreate command earlier.


root@Mega:~# vgextend Mega /dev/sda3
  Volume group "Mega" successfully extended

Using the pvscan command we scan all disks for physical volumes, this should confirm the original /dev/sda5 partition and the newly created physical volume /dev/sda3


root@Mega:~# pvscan
  PV /dev/sda5   VG Mega   lvm2 [19.76 GiB / 0    free]
  PV /dev/sda3   VG Mega   lvm2 [10.00 GiB / 10.00 GiB free]
  Total: 2 [29.75 GiB] / in use: 2 [29.75 GiB] / in no VG: 0 [0   ]

Next we need to increase the logical volume (rather than the physical volume) which basically means we will be taking our original logical volume and extending it over our new partition/physical volume of /dev/sda3.

Firstly confirm the path of the logical volume using lvdisplay. This path name will vary depending on your setup.


root@Mega:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/Mega/root

The logical volume is then extended using the lvextend command.


root@Mega:~# lvextend /dev/Mega/root /dev/sda3
  Extending logical volume root to 28.90 GiB
  Logical volume root successfully resized

There is then one final step which is to resize the file system so that it can take advantage of this additional space, this is done using the resize2fs command for ext based file systems. Note that this may take some time to complete, it took about 30 seconds for my additional space.


root@Mega:~# resize2fs /dev/Mega/root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/Mega/root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/Mega/root to 7576576 (4k) blocks.
The filesystem on /dev/Mega/root is now 7576576 blocks long.

Alternatively if you’re running the XFS file system (default as of RedHat/CentOS 7) you can grow the file system with “xfs_growfs /dev/Mega/root”.

That’s it, now with the ‘df’ command we can see that the total available disk space has been increased.

F4F.jpg


2.14 Como crear supletorios

ATENCIÓN: SE CREAN CONFIGURACIONES NO REFLEJADAS EN PORTAL DE ADMINISTRACIÓN

Igual que el caso anterior pero en la variable ponemos números reales. Debido a un bug en el enrutador, que no devuelve la variable R_PARA, en el fichero ext_MARCAR_Extension.conf hay que sustituir la siguiente linea:

;same =>     n,ExecIf($["${EXT${R_PARA}}"=""]?NoOp:Set(ENR_CADMARCAR=${ENR_CADMARCAR}&${EXT${R_PARA}}))

Por esta otra:

 same =>     n,ExecIf($["${EXT${R_DEST_${ENR_RUTA_CAD}}}"=""]?NoOp:Set(ENR_CADMARCAR=${ENR_CADMARCAR}&${EXT${R_DEST_${ENR_RUTA_CAD}}}))

ATENCIÓN !!! en las llamadas salientes cada uno presenta su número

Para emplear números externos en los supletorios hay que poner, al crear la variable que hemos explicado en el apartado anterior en el ext_MDtel_Particular.conf:

EXT335=>SIP/0999999999@Trunk_Movil ;En este caso suena en la ext 335 y en el móvil 999999999


2.15 Añadir Auto-Answer a la cabecera SIP

Si queremos que un teléfono tenga autoanswer:

  • En el peer poner: headeraa=Call-Info: answer-after=0, esto tiene que ir en la plantilla de la extensión o como campo en la extensión. Dependiendo del terminal que utilicemos el valor de este campo variará:
   Aastra: Alert-Info: info=alert-autoanswer
   Grandstream: Call-Info: answer-after=0
   Linksys: Call-Info:\;Answer-After=0
   Polycom: Alert-Info: Ring Answer
   Snom: Call-Info: answer-after=0
   Snom (nuevo firmware): Call-Info: <sip:IP>\;answer-after=0
   Yealink: Call-Info: answer-after=0
  • Luego en el dialplan añadir lo siguiente: exten => _[*#%0-9a-zA-Z].,n,set(__AutoAnswer=AA) (Esto tendremos que ver como ponerlo de manera automática). De manera provisional si queremos que sea para llamadas salientes pondremos esto en el ext_n_marcador.conf. Si queremos que sea llamadas entrantes lo pondremos en ext_n_MARCAR.conf


2.16 Activación de la movilidad para un usuario

Una vez configurada la movilidad e intentar activarla nos da error cuando le ponemos el usuario y la contraseña.

La configuración del usuario es la siguiente:

Problema.jpg


Para que la movilidad funcione hay que asignar un teléfono a la extensión, quedando la configuración de esta manera:


Asignacion de telefono.jpg


2.17 Script para cambio automático de claves en salas de conferencia estáticas

Para cambiar la clave de las salas de conferencias crear un script llamado cambioClaveConfe.sh con el siguiente contenido:

#!/bin/bash
CLAVE=$(shuf -i 1111-9999 -n 1)

echo $CLAVE

echo "update CEN_SALAS_CONFERENCIAS set C_PIN='$CLAVE' WHERE C_NOMBRE='$1'" | mysql -u nimitz -pivivanimitz nimitz

FROM=sat@mdtel.es
FECHA=`date +"%Y%m%d%H%M%S"`
CLIENTE=<PONER EL CLIENTE>
TO=<DESTINATARIOS>
ASUNTO="Nueva clave en sala $1"
CUERPO="La nueva clave para la sala $1 es: $CLAVE"
/usr/sbin/sendmail -oi -t -v -f $FROM <<EOF
From: $FROM
To: $TO
Bcc: $BCC
Subject: $ASUNTO

$CUERPO
EOF

El script cambiará la clave de la sala pasada por parámetro por una aleatoria de 4 dígitos y la enviará por correo a los <DESTINATARIOS> (direcciones de correo electrónico separadas por coma).

Hay que crear una tarea en /etc/crontab añadiendo una linea como la siguiente:

30 6	* * 7	root	cambioClaveConfe.sh 6173

Esto ejecutará el script todos los domingos a las 6:30 horas cambiando la clave de la sala 6173. Añadir tantas linéas como salas.


2.18 Como modificar el tiempo de desvío por No Contesta, en la extensión

Esta facilidad estaba presente en versiones anteriores, pero no en la versión 3.1

Mientras se implementa la facilidad en nuevas versiones se aplica una modificación en el dial plan que permite realizar al cliente esta facilidad.

Nosotros en maqueta hemos probado una posible solución.

ext_MARCAR_Extension_Particular.conf
same => n,NoOp(* Tiempo dial para desvio no contesta en Ext. ${EXTEN} = ${SIPPEER} *)
same => n,Set(tDial=${SIPPEER})
ext_MARCAR_Extension_Dial.conf
same => n,ExecIf($["${tDial}"=""]?set(tDial=40)); DGR
same => n,Dial(${ENR_CADMARCAR},${tDial},eU(Cen_Marcar_Extension_Dial_Gosub,s,1)) ; DGR

La forma de pasar el tiempo de desvío es a través de una una variable configurada en el portal (Extensión) "setvar=tiempoDial=[tiempo desvio]"


Cen_MARCAR_Extension_Dial_Particular]
exten => _[*#%0-9].,1,NoOp(MDMAREXTENDIALPAR)
same =>       n,NoOp(* Llamada en espera Ext. ${EXTEN} = ${SIPPEER(${EXTEN},chanvar[llamEsp])} )
same =>       n,NoOp( Tiempo dial para desvio no contesta en Ext. ${EXTEN} =     ${SIPPEER(${EXTEN},chanvar[tiempoDial])} *)
same =>       n,Set(tDial=${SIPPEER(${EXTEN},chanvar[tiempoDial])})
same =>       n,GotoIf($[$["${SIPPEER(${EXTEN},chanvar[llamEsp])}"="Si"] | $["${SIPPEER(${EXTEN},chanvar[llamEsp])}"="si"] | $["${SIPPEER(${EXTEN},chanvar[llamEsp])}"="SI"]]?libre:NoLlamEspera)
same =>       n(NoLlamEspera),NoOp(* Llamadas actuales = ${SIPPEER(${EXTEN},curcalls)} *)
same =>       n,GotoIf($["${SIPPEER(${EXTEN},curcalls)}" = ""]?libre)
same =>       n,GotoIf($[${SIPPEER(${EXTEN},curcalls)}>0]?ocupado:libre)
same =>       n(ocupado),Return(OCUPADO)
same =>       n(libre),Return(OK)

include => Cen_finLlamada s etvar=tiempoDial=10

same =>                  n,ExecIf($["${tDial}"=""]?set(tDial=40)); DGR
same =>                  n,Dial(${ENR_CADMARCAR},${tDial},eU(Cen_Marcar_Extension_Dial_Gosub,s,1)) ; DGR

2.19 Como conseguir que cuando una llamada se abandone en cola se envíe un correo con la información de la llamada

Ejemplo de php para envío de correo:

#!/usr/bin/php
$mailto = "xxxxxx@xxxx.es";
$subject = "Call Center Alert";
$headers = 'From: webmaster@callcenter.com' . "\r\n" . 'Reply-To: webmaster@callcenter.com' . "\r\n" . 'X-Mailer:  PHP/' . phpversion();

$date = $argv1;
$queue = $argv2;
$text = "";

$formatted_date = gmdate("Y-m-d\TH:i:s\Z",$date);

$text = "Call from 9000 on queue $queue was abandoned at $formatted_date after 60 seconds wait.\n";

if($text <> ) {
mail($mailto, $subject, $text, $headers);
}


2.20 Como tener extensiones del mismo rango de numeración en dos nodos de VIVAit Call

Hay que añadir el campo insecure=invite en la extensiones.


2.21 Como modificar el tiempo del desvío por no contesta sin que afecte al ring estándar de 40 segundos

Se trata de modificar el tiempo del desvío por no contesta sin que afecte al ring estándar de 40 segundos, en caso de no tener el desvío activado.


Por ejemplo, el dial hacia las extensiones dura 40 segundos, pero en caso de tener un desvío por no contesta activado, tiene que durar 20.


Analizando el DumpChan vemos que hay una variable que indica si hay un desvío activado.


Con eso hacemos la comprobación del desvío en el fichero ext_MARCAR_Extension_Particular.conf y aplicamos la configuración deseada.


Comprobación del desvío "No contesta" y asignación del tiempo ring:

same => n,ExecIf($["${R_DESV_NC}" = ""]?Set(tDial=35):Set(tDial=${SIPPEER}))


2.22 Como mostrar la existencia de un desvío en terminales GrandStream

Cuando se activa un desvío desde el portal de usuario o utilizando la facilidad *21* en los terminales GrandStream el terminal no muestra en pantalla el estado en el que se encuentra.


La solución es crear una facilidad igual que la de desvío incondicional y cuando se active encender un blf y cuando se desactive apagar el blf. Esto se consigue haciendo un customBLF.

[Cen_Facilidad_10013]

exten => _[*#%0-9a-zA-Z].,1,NoOp(MDSER_desvExtenIncond)
same => n,Gosub(Cen_Sub_gestDesvExten,s,1(${ENR_ORIGEN},C_DESVIO_INCONDICIONAL,${R_DEST_00}))
same => n,GotoIf($["${GOSUB_RETVAL}"="OK"]?:error)
same => n,Set(DEVICE_STATE(Custom:P${ORIGEN})=INUSE)
same => n,GotoIf($["${R_DEST_00}"=""]?desactivar)
same => n,Playback(cen_desvIcondActiv)
same => n,SayDigits(${R_DEST_00})
same => n,Return(0)
same => n(desactivar),Playback(cen_desvIcondDesac)
same => n,Set(DEVICE_STATE(Custom:P${ORIGEN})=NOT_INUSE)
same => n,Return(0)
same => n(error),Playback(vm-opeMal)
same => n,Return(0)

include => Cen_finLlamada

Se añade en el ext_Subscribe.conf

exten => _P4XXX,hint,Custom:${EXTEN}

Finalmente se crea el BLF del terminal.


2.23 Como configurar el sistema para que reproduzca una locución en llamadas salientes que se graban

Está implementado en el core de la próxima versión (3.3) una funcionalidad para dar un mensaje al llamado en las llamadas salientes, antes de que la llamada sea conectada.


Esto se realiza mediante al opción A del comando dial.


Para implementar esta funcionalidad debemos tener una variable con el nombre LOCU_AVISO_GRAB en el fichero ext_MDTEL_Particular.conf con el nombre de la locución a reproducir.


Si la variable esta definida, y la llamada está siendo grabada, la locución será reproducida antes de la conexión.



2.24 Como configurar el sistema cuando existe una máquina dedicada a las grabaciones

Cuando una de las máquinas del sistema se dedica en exclusiva a las grabaciones es necesario un template escecífico para el RecordCentral:

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>2.0</version>
    <date>2014-10-06T10:34:16Z</date>
    <groups>
        <group>
            <name>Templates MDtel</name>
        </group>
    </groups>
    <templates>
        <template>
	    <template>Template RecordCentral</template>
            <name>Template RecordCentral</name>
            <groups>
                <group>
                    <name>Templates MDtel</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>recordCentral</name>
                </application>
            </applications>
            <items>
                <item>
                    <name>recordCentral 0 activo</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.0.activo</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap>
                        <name>Service state</name>
                    </valuemap>
                </item>
                <item>
                    <name>recordCentral Conexión MySQL</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.mysqlcnx</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>Numero de conexiones contra el MySQL</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                     <name>recordCentral cuarentena</name>
                    <type>7</type>
                    <snmp_community/>
                     <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.cuarentena</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral fecha de inicio</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.start</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>1</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral fecha última alarma</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.ultima</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description>Marca de tiempo en la que se produjo la ultima alarma</description>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral grabaciones</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.grabNum</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>1</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral grabaciones con error</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.grabError</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>1</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral NAS llamadas</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.nasLlam</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral NAS segmentos</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.nasSeg</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                     <privatekey/>
                    <port/>
                     <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                 </item>
                <item>
                    <name>recordCentral retraso</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.retraso</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral segmentos</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.segm</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral segmentos con error</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.segmError</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral Total alarmas</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.alarms</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units>Alarma(s)</units>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
                <item>
                    <name>recordCentral version</name>
                    <type>7</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>recordCentral.sis</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>1</status>
                    <value_type>4</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                           <name>recordCentral</name>
                        </application>
                    </applications>
                    <valuemap/>
                </item>
            </items>
            <discovery_rules/>
            <macros/>
            <templates/>
            <screens/>
        </template>
     </templates>
   <triggers>
        <trigger>
	    <expression>{Template   RecordCentral:recordCentral.cuarentena.count(900,0,"gt")}>12</expression>
            <name>recordCentral Gateways en cuarentena</name>
            <url/>
            <status>0</status>
            <priority>2</priority>
            <description/>
            <type>0</type>
            <dependencies/>
        </trigger>
        <trigger>
            <expression>{Template RecordCentral:recordCentral.nasLlam.last(0)}=0</expression>
            <name>recordCentral NAS llamadas desconectado</name>
            <url/>
            <status>0</status>
            <priority>3</priority>
            <description/>
            <type>0</type>
             <dependencies/>
        </trigger>
        <trigger>
            <expression>{Template RecordCentral:recordCentral.nasSeg.last(0)}=0</expression>
            <name>recordCentral NAS segmentos desconectado</name>
            <url/>
            <status>0</status>
            <priority>3</priority>
           <description/>
           <type>0</type>
           <dependencies/>
       </trigger>
       <trigger>
           <expression>{Template RecordCentral:recordCentral.retraso.count(600,21600,"gt")}>4</expression>
           <name>recordCentral retrasado en exceso</name>
           <url/>
           <status>0</status>
           <priority>3</priority>
           <description/>
           <type>0</type>
           <dependencies/>
       </trigger>
   </triggers>
</zabbix_export>


2.25 Como configurar el sistema para que Asterisk deje pasar los tonos

Para configurar que Asterisk deje pasar los tonos hacía otros dispositivos (por ejemplo una central de alarmas) usaremos la función SetChannelOption

Para seleccionar el dispositivo al que lo queremos aplicar, se usan las siguientes líneas en Cen_Marcar_Extension_Dial_Gosub

;Declarar la variable PASARTONOS en el trunk que queramos 
 same => n,ExecIf($["${PASARTONOS}"="1"]?SetChannelOption(14,0))

Esta modificación se incluirá en la próxima versión del producto.


2.26 Como solucionar problemas de seguridad en servicio de directorio para agendas de terminales

En algún cliente se ha instalado como servicio de LDAP para agendas de teléfono el programa OpenSouce PHPLDAP y se ha podido acceder a la información residente en el servicio de directorio que se ha montado para las agendas de terminales usando un usuario anonimo.

Para solucionar el problema hay que:

  • Añadir la siguiente configuración al fichero /etc/ldap/slapd.conf:
disallow bind_anon
  • Luego reiniciamos el servicio openldap:
/etc/init.d/slapd stop
/etc/init.d/slapd start

Por defecto, el open LDAP posee una configuracion en arbol llamada DIT, por lo que no tiene el fichero slapd.conf.

A modo de informacion, para que la configuracion del ldap pase a ser un fichero .conf hay que:

modificar el archivo /etc/default/slapd y poner SLAPD_CONF="/etc/ldap/slapd.conf"

Posteriormente se crea el fichero slapd.conf de la siguiente forma:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema

pidfile /var/run/slapd/slapd.pid

argsfile /var/run/slapd/slapd.args

loglevel none

modulepath /usr/lib/ldap
moduleload back_ldap.la
moduleload back_hdb.la
moduleload back_bdb.la
moduleload rwm
moduleload pcache.la
moduleload memberof.la

sizelimit 500

tool-threads 1

backend ldap

database bdb

suffix "dc=mdtel,dc=net" 

rootdn "cn=admin,dc=mdtel,dc=net"

rootpw {SSHA}9SmIlphCHEp5vojzhClh1mbPpduK1U6y

directory "/var/lib/ldap"

dbconfig set_cachesize 0 2097152 0

dbconfig set_lk_max_objects 1500

dbconfig set_lk_max_locks 1500

dbconfig set_lk_max_lockers 1500

index objectClass eq

lastmod on

checkpoint 512 30

access to dn.base="dc=mdtel,dc=net" by * read

access to *
by dn="dc=mdtel,dc=net" write
by * read

  • Tras ello reiniciar el servicio:
service slapd stop 

service slapd start
  • Sin embargo, para restringir al acceso anomimo mediante un DIT hay que:
  • Crear file ldiff: nano /tmp/ldap_disable_bind_anon.ldif
  • Pegar esto: dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon dn: cn=config changetype: modify add: olcRequires olcRequires: authc dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcRequires olcRequires: authc
  • Y luego ejecutar: ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/ldap_disable_bind_anon.ldif


2.27 Como solucionar problemas de enrutamiento en terminales con doble registro

En ciertas marcas/modelos de terminal, cuando se activa el doble registro y se registran en los dos servidores a la vez, ocurre que cuando se transfiere la llamada no vuelve al origen para enrutar sino que como detecta que la extensión está registrada en ambos nodos y no entra por el contexto cen_trunkinternos, sino por cen_inicio_sip.

Este fallo se detectó en clientes que tienen prefijos en llamadas salientes para realizar algún tratamiento de llamada.

Al tener una configuración de type=friend e insecure=port, logramos reproducir el problema. AL hacer una llamada desde A logado en corp0 a B, logado en corp1, la llamada entra en B como cen_inicio_sip

Cambiando a type=peer esto se soluciona.

Decidimos también cambiar el insecure a no, tras realizar pruebas de llamadas con ciscos y las llamadas funcionan y entran por donde tienen que entrar


Para solucionar el problema hay que cambiar la plantilla de trunk enlaces interiores:

type=peer
;secret=supersecret
context=Cen_TrunkInternos
;qualify=10000
;auth=md5
disallow=all
allow=alaw
allow=gsm
;insecure=port,invite
insecure=no
directmedia=yes
sendrpid=rpid
trust_id_outbound=yes
trustrpid=yes
rpid_update=yes


2.28 Como configurar tomcat para solucionar un problema de lentitud en el portal cuando el número de extensiones dadas de alta es muy elevado

La consulta que se recupera como lenta es la que se refiere a los usuarios. En esta consulta se observa que es al intentar recuperar la extensión de movilidad la que lo ralentiza.

Este campo se recupera para dar la posibilidad de liberar esta asignación desde el portal por si no se hubiese hecho desde la propia extensión.

Hay que ver las opciones con las que está trabajando tomcat

ps -ef | grep tomcat8

nos fijamos en la cadena -Xms y -Xmx que indican la cantidad de memoria inicial y máxima que va a reservar.

Para configurar unas opciones diferentes definiremos un archivo setenv.sh en la carpeta "TOMCAT_HOME"/bin con la siguiente línea

export JAVA_OPTS="-Djava.awt.headless=true -Xms4096m -Xmx4096m"

4096m equivalen a 4gb si no pudiesemos disponer de esta cantidad de memoria reduciríamos la cantidad.

2.29 Como configurar el Lanzador.ini para permitir que haya dos repositorios en la misma máquina

El lanzador, hasta ahora, configura una url que llama al ws y una url que devuelve una carpeta de donde descarggar los archivos, el problema se produce cuando la url es común y usa siempre la misma carpeta para generar el archivo de actualizaciones, por lo que aunque finalmente se descarguen estos ficheros de la carpeta correcta, es obligatorio reflejar los cambios que se quieren actualizar en la segunda carpeta en la primera.

Para permitir la existencia de dos repositorios se modifica el ws para que consulte por la existencia de un parámetro "carpeta", en caso de que el parámetro exista la ruta de acceso a la carpeta de generación del archivo xml de actualizaciones será la que venga en este parámetro, en caso de no existir cogerá la que está configurada por defecto como hace hasta ahora y de este modo ser compatible con las configuraciones ya existentes.

Ejemplo de lanzador.ini con la nueva configuración:

[Lanzador]
URL="http://dirección-IP:puerto/WSActualizaXML/actualizar.xml?carpeta=/var/spool/MDtel/nimitz2/"
BASE_URL_DESCARGAS="http://dirección-IP:puerto/XMLFILES2/"


2.30 Integración con H.323

OBLIGATORIO USO DE UBUNTU 10.04 de 32 BITS

ES NECESARIO ASEGURARSE QUE LOS DN's SON BUENOS


Tras instalar el ubuntu realizaremos los siguientes pasos:

  • Modificaremos los repositorios ya que el S.O. está deprecado
  • cd /etc/apt/
  • mv -vi sources.list sources.list.orig
  • cp -vi sources.list.orig sources.list
  • vi sources.list


# 
# deb cdrom:[Ubuntu-Server 10.04.4 LTS _Lucid Lynx_ - Release i386 (20120214.2)]/ lucid main restricted 

#deb cdrom:[Ubuntu-Server 10.04.4 LTS _Lucid Lynx_ - Release i386 (20120214.2)]/ lucid main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://old-releases.ubuntu.com/ubuntu/ lucid main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://old-releases.ubuntu.com/ubuntu/ lucid-updates main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://old-releases.ubuntu.com/ubuntu/ lucid universe
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid universe
deb http://old-releases.ubuntu.com/ubuntu/ lucid-updates universe
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://old-releases.ubuntu.com/ubuntu/ lucid multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid multiverse
deb http://old-releases.ubuntu.com/ubuntu/ lucid-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ lucid-updates multiverse

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://es.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse
# deb-src http://es.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu lucid partner
# deb-src http://archive.canonical.com/ubuntu lucid partner

deb http://security.ubuntu.com/ubuntu lucid-security main restricted
deb-src http://security.ubuntu.com/ubuntu lucid-security main restricted
deb http://security.ubuntu.com/ubuntu lucid-security universe
deb-src http://security.ubuntu.com/ubuntu lucid-security universe
deb http://security.ubuntu.com/ubuntu lucid-security multiverse
deb-src http://security.ubuntu.com/ubuntu lucid-security multiverse


  • apt-get update
  • apt-get upgrade
  • apt-get dist-upgrade
  • reboot
  • apt-get install libpt-1.10.10-dev
  • apt-get install libopenh323-dev
  • cd /usr/src/
  • mkdir MDtel
  • Cogeremos el asterisk ACD usado en Vivait-Suite version MDASTACD_3_5_0.tar.gz
  • mv -vi /tmp/MDASTACD_3_5_0.tar.gz /usr/src/MDtel/
  • cd /usr/src/MDtel
  • tar xvzf MDASTACD_3_5_0.tar.gz
  • apt-get install build-essential gdb ngrep tcpdump screen unixodbc-dev
  • ln -s MDASTACD_3_5_0_ast-1_4_24_rsp140 asterisk
  • cd asterisk
  • cd res/
  • rm -v res_mdcal.c
  • mv -vi res_mdgh.c res_mdgh.c.orig
  • cd ../apps/
  • mv -vi app_crash.c app_crash.c.orig
  • cd ../channels/
  • mv -vi chan_sip.c chan_sip.c.perro_mdgh
  • cp -vi chan_sip.c.20161020 chan_sip.c
  • ./configure
  • make menuselect
  • make
  • make install
  • make samples
  • make config
  • addgroup --system --gid 5060 asterisk
  • adduser --system --shell /bin/bash --uid 5060 --gid 5060 --home /var/lib/asterisk --no-create-home --gecos "Asterisk PBX" asterisk
  • mkdir -p /var/lib/asterisk/sounds/Particular
  • mkdir -p /var/lib/asterisk/sounds/WEB
  • chmod 775 /var/lib/asterisk/sounds/
  • chmod 775 /var/lib/asterisk/sounds/WEB
  • chmod 775 /var/lib/asterisk/moh/
  • chmod 775 /var/spool/asterisk/monitor
  • chmod 775 /etc/asterisk
  • chmod 664 /etc/asterisk/*
  • chown -R asterisk:asterisk /var/lib/asterisk
  • chown -R asterisk:asterisk /var/log/asterisk
  • chown -R asterisk:asterisk /var/spool/asterisk
  • chown -R asterisk:asterisk /usr/lib/asterisk
  • chown -R asterisk:asterisk /etc/asterisk
  • chown -R asterisk:asterisk /var/run/asterisk
  • cd /etc/asterisk/
  • vi modules.conf
;
; Asterisk configuration file
;
; Module Loader configuration file
;

[modules]
autoload=yes
;
; Any modules that need to be loaded before the Asterisk core has been
; initialized (just after the logger has been initialized) can be loaded
; using 'preload'. This will frequently be needed if you wish to map all
; module configuration files into Realtime storage, since the Realtime
; driver will need to be loaded before the modules using those configuration
; files are initialized.
;
; An example of loading ODBC support would be:
;preload => res_odbc.so
;preload => res_config_odbc.so
;
; Uncomment the following if you wish to use the Speech Recognition API
;preload => res_speech.so
;
; If you want, load the GTK console right away.  
;
noload => pbx_gtkconsole.so
;load => pbx_gtkconsole.so
;
load => res_musiconhold.so
;
; Load either OSS or ALSA, not both
; By default, load OSS only (automatically) and do not load ALSA
;
noload => chan_alsa.so
;noload => chan_oss.so

;----------------------------------------------------------------------------------------------
noload => app_queue.so
noload => chan_sit.so
noload => app_mensajeria.so
noload => app_externalivr.so
noload => app_voicemail.so
noload => cdr_adaptive_odbc.so
noload => cdr_odbc.so
noload => cdr_custom.so
noload => cdr_csv.so
noload => res_config_mysql.so
noload => res_config_odbc.so
noload => res_odbc.so
noload => res_smdi.so
noload => chan_agent.so
noload => chan_mgcp.so
noload => chan_ooh323.so
noload => chan_oss.so
noload => chan_phone.so
noload => chan_skinny.so
noload => cdr_addon_mysql.so
noload => app_dbodbc.so
noload => pbx_dundi.so
noload => pbx_realtime.so
noload => pbx_ael.so


  • mv -vi h323.conf h323.conf.orig
  • vi h323.conf
[general]
port = 1720
;bindaddr=xxx.xxx.xxx.xxx
bindaddr=yyy.yyy.yyy.yyy
context=Cen_Inicio_H323
disallow=all
allow=alaw
;allow=g729
dtmfmode=rfc2833
gatekeeper=DISABLE
progress_setup=8
progress_alert=8
fastStart=yes
;accountcode=asterisk
tratarUCID=no

[zzz.zzz.zzz.zzz]
context=Cen_Inicio_H323
language=es
type=friend
host=zz.zz.zzz.zz
port=1720
dtmfmode=inband
gatekeeper=DISABLE
progress_setup=8
progress_alert=8
disallow=all
allow=alaw
;allow=g729
fastStart=no
h245tunneling=no
h245inSetup=no
tratarUCID=no
  • mv -vi sip.conf sip.conf.orig
  • vi sip.conf
[general]
context=Cen_Desconocido
language=es
recordhistory=no
srvlookup=no
notifymimetype=application/simple-message-summary
rtptimeout=10
callevents=1
sendrpid=yes
allowsubscribe=yes
notifyringing=yes
notifyhold=yes
limitonpeer=yes
bindaddr=xxx.xxx.xxx.xxx

[Vivait-Call]
host=$$$.$$$.$$$.$$$
qualify=yes
qualifyfreq=60
type=peer
;secret=supersecret^M
context=Cen_Inicio_SIP
;qualify=10000^M
;auth=md5^M
disallow=all
allow=alaw
;insecure=port,invite^M
insecure=no
canreinvite=no
sendrpid=rpid
trust_id_outbound=yes
trustrpid=yes
rpid_update=yes 


  • mv -vi extensions.conf extensions.conf.orig
  • vi extensions.conf
[general]
static=yes
writeprotect=no
autofallthrough=no
clearglobalvars=yes

[globals]

[default]
exten => _X.,1,NoOp(Default_X.)
same=> n,Hangup

exten => s,1,NoOp(Default_s)
same => n,Hangup

[Cen_Desconocido]
exten => _X.,1,NoOp(Default_X.)
same=> n,Hangup 

exten => s,1,NoOp(Default_s)
same => n,Hangup

[Cen_Inicio_SIP]
exten => _[*#%0-9].,1,NoOp(Contexto entrada SIP)
 same =>             n,Dial(H323/${EXTEN}@zzz.zzz.zzz.zzz)
 same =>             n,Hangup

[Cen_Inicio_H323]
exten => _[*#%0-9].,1,NoOp(Contexto entrada H323)
 same =>             n,Dial(SIP/${EXTEN}@Vivait-Call)
 same =>             n,Hangup
  • /etc/init.d/asterisk start


Para proteger el SO realizaremos un firewall:

cat /etc/firewall

#!/bin/sh

export ETH_VOZ=eth0
export IP_VOZ=192.xxx.xxx.131
export RED_VOZ=192.yyy.yyy.0/25
export IP_VOZ_COLATERAL=192.zzz.zzz.130
export ETH_MB=eth1
export IP_MB=10.xxx.xxx.70
export RED_MB=10.yyy.yyy.0/29
export IP_MB_COLATERAL=10.zzz.zzz.2 

# Se inician las cadenas
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

### INPUT
iptables -P INPUT ACCEPT

### OUTPUT
iptables -P OUTPUT ACCEPT

### FORWARD
iptables -P FORWARD DROP

##### input VOZ
iptables -A INPUT -i $ETH_VOZ -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $ETH_VOZ -m state --state INVALID -j DROP
### rtp
iptables -A INPUT -i $ETH_VOZ -p udp --dport 11100:11999 -j ACCEPT
### sip
iptables -A INPUT -i $ETH_VOZ -p udp -s $IP_VOZ_COLATERAL --dport 5060 -j ACCEPT
### ssh
iptables -A INPUT -i $ETH_VOZ -s $IP_VOZ_COLATERAL -p tcp --dport 22 -j ACCEPT
### resto
if [ "$ETH_VOZ" != "$ETH_MB" ]
then
  iptables -A INPUT -i $ETH_VOZ -j DROP

##### input MB
  iptables -A INPUT -i $ETH_MB -m state --state RELATED,ESTABLISHED -j ACCEPT
  iptables -A INPUT -i $ETH_MB -m state --state INVALID -j DROP
### rtp
  iptables -A INPUT -i $ETH_MB -p udp --dport 11100:11999 -j ACCEPT
fi
### h.225 (1720) y h.245 (puerto desconocido)
iptables -A INPUT -i $ETH_MB -s $IP_MB_COLATERAL -p tcp -j ACCEPT
### resto
iptables -A INPUT -i $ETH_MB -j DROP 

##### output

##### forward

2.31 Instalación de un trunk sip de VODAFONE sin SBC

Instalación de un trunk sip de VODAFONE sin SBC


2.32 Como configurar VIVAit Fax para que funcione T38 con g729

Hay que hacer cambios en tres ficheros.


  • Fichero sip.conf
[general]
context=Cen_Desconocido
language=es
recordhistory=no
allowoverlap=no
udpbindaddr=172.16.4.11
tcpenable=no
transport=udp
srvlookup=no
notifymimetype=application/simple-message-summary
allowsubscribe=yes
notifyringing=yes
notifyhold=yes
directmedia=no
faxdetect=no
;faxdetect=yes
;Passthrough=yes
t38pt_udptl=yes

;----------------------------------------------------------------
#include "sip_trunk.conf"
#include "sip_user.conf"
  • Fichero sip_trunk.conf
;========================================================================
;Trunk sip Gateway UCMGW1
;========================================================================
[SipTrunk_ono]
type=friend
language=es
host=10.4.27.135
context=Cen_entraTrunkSip
qualify=yes
disallow=all
allow=g729
insecure=port,invite
;t38pt_udptl=yes
;faxdetect=yes
faxdetect=no
description=Trunk sip contra ono-italtel
  • Fichero ext_FAX.conf

Cambiar

exten => receive,n,ReceiveFax(/var/spool/vivafax/recibidos/${FAXFILE},dfFs)

Por

exten => receive,n,ReceiveFax(/var/spool/vivafax/recibidos/${FAXFILE},d)

Cambiar

exten => send,n,SendFAX(${PDFFILE}.tiff,dfF)

Por

exten => send,n,SendFAX(${PDFFILE}.tiff,d)


2.33 Como pasar a SIP sobre TCP

Para habilitar el tcp en el trunk añadir tcpenable=yes en la plantilla del sip general y transport=tcp en el peer del trunk. Aplicar los cambios con sip reload en el Asterisk


2.34 Como optimizar la creación de VDN's

Esta solucion está disponible a partir de la versión de VIVAit 3.4

En instalaciones que tienen una gran cantidad de VDN's, y estos VDN's tienen todos un tratamiento común, la solución actual implica tener que escribir todos los VDN's con el mismo código.


Para solucionar esto hemos modificado unas líneas en el core del dialplan (tener en cuenta la versión de la aplicación instalada), para que si no existen el contexto específico del VDN la llamada pasa a un contexto de VDN comun Cen_VDN.


Los cambios se realizan en el fichero ext_MARCAR_VDN_Dial.conf


En versiones anteriores a VIVAit 3.4 el fichero tiene:

;-----------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
[Cen_Marcar_VDN_Dial]
;-----------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
exten => _X.,1,NoOp(MDVDN*****EXTEN=${EXTEN}**CID=${CALLERID(NUM)}**UCID=${UCID}*)
 ;same =>     n,Set(SPYGROUP=${EXTEN})
 ;same =>     n,CallSpyee(,,${EXTEN},,)
 same =>     n,Gosub(Cen_Sub_SpyGroup_VDN,s,1(${EXTEN}))

 same =>     n,Set(__HORA_INICIO_VDN=${EPOCH})
 same =>     n,set(CALLERID(num)=${R_CID_NUM_${ENR_RUTA_CAD}})
 same =>     n,set(CALLERID(name)=${R_CID_NAME_${ENR_RUTA_CAD}})
 same =>     n,Set(CAUSA_COLGADO=${SEGDESPUES_COLGADA})

 same =>     n,Goto(Cen_VDN_${R_DEST_00},${R_DEST_00},1)


include => Cen_finLlamada


El fichero debe quedar de la siguiente forma:


;-----------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
[Cen_Marcar_VDN_Dial]
;-----------------------------------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
exten => _X.,1,NoOp(MDVDN*****EXTEN=${EXTEN}**CID=${CALLERID(NUM)}**UCID=${UCID}*)
 ;same =>     n,Set(SPYGROUP=${EXTEN})
 ;same =>     n,CallSpyee(,,${EXTEN},,)
 same =>     n,Gosub(Cen_Sub_SpyGroup_VDN,s,1(${EXTEN}))

 same =>     n,Set(__HORA_INICIO_VDN=${EPOCH})
 same =>     n,set(CALLERID(num)=${R_CID_NUM_${ENR_RUTA_CAD}})
 same =>     n,set(CALLERID(name)=${R_CID_NAME_${ENR_RUTA_CAD}})
 same =>     n,Set(CAUSA_COLGADO=${SEGDESPUES_COLGADA})

 ;same =>     n,Goto(Cen_VDN_${R_DEST_00},${R_DEST_00},1)

 same =>     n,GotoIf($[${DIALPLAN_EXISTS(Cen_VDN_${R_DEST_00},${R_DEST_00},1)}>0]?Cen_VDN_${R_DEST_00},${R_DEST_00},1))
 same =>     n,Goto(Cen_VDN,${R_DEST_00},1)



include => Cen_finLlamada


Hay que comentar una línea y añadir dos nuevas

En algunos casos, en el contexto común Cen_VDN habrá que leer de la agenda para averiguar el número de la Oficina Vodafone al que hay que redirigir la llamada en caso de no estar los agentes.


2.35 Como configurar la grabación de llamadas entre agentes

1. Configurar en el nodo ACD envio del numero de Agente.

   ext_InicioLlamada_ExtSIP_Particular.conf
   [Cen_Inicio_SIP_Particular]
   exten => _[*#%0-9]!,1,NoOp(MDINISIPPAR**EXTEN=${EXTEN}**CID=${CALLERID(NUM)}*)
    same =>            n,ExecIf($["${EXTEN:0:2}"="21"]|Set|__SIPADDHEADER-numAgente=X-numAgente: ${EXTEN})

   same =>            n,Return()

2. Configurar el dispositivo para grabar.

   /VIVAIT CALL/Dispositivos/extensiones.
       170999 | Ext. especial para grabar Agentes |  NODO-CORP-02
       ID=336

3. Configurar vdn corporativo.

   170650 | VDN para grabar las llamadas entre agentes | NODO-CORP-02
  

4. Configurar en el nodo corporativo el vdn.

   ext_MARCAR_VDN_Particular.conf
   [Cen_VDN_170650]
       exten => 170650,1,NoOp(MDVDN_${EXTEN}*****EXTEN=${EXTEN}**CID=${CALLERID(NUM)}**UCID=${UCID}*)
        same =>        n,NoOP(*** VDN para grabar las llamadas entre agentes ***)
        same =>        n,Set(numAgente=${SIP_HEADER(X-numAgente)})
        same =>        n,Set(ENR_ORIGEN=336)
        same =>        n,Set(ENR_PEER_ORIGEN=)
        same =>        n,Set(ENR_TIPO_ORIGEN=10)
        same =>        n,Set(CALLERID(name)=Agente)
        same =>        n,Answer()
        same =>        n,Goto(Cen_Enrutador,333${numAgente},1)
        same =>        n,Hangup(16)
include => Cen_finLlamada
   ENR_ORIGEN (dispositivo creado solo para grabar)
   ENR_PEER_ORIGEN (setear esta variable vacia)
  

5. Configurar las rutas

   - Rutas marcación numero de agente 21XX Salida
       Destino 170650 | tipo destino vdn corporativo
   - Rutas marcación numero de agente 33321XX Entrada
       prefijo 33321 | Destino -3 Tipo destino Agente


2.36 Como configurar que en los grupos corporativos se generen las extensiones en el Nodo Secundario

Hay que añadir OR con ID_NODO_SECUNDARIO de CEN_EXTENSIONES a la hora de generar un grupo de salto.


Ir arriba

3 VIVAit Suite

3.1 Crear un motivo de desconexión para el Supervisor en VIVAit Suite

Para crear motivos de desconexión adicionales a los que ya ofrece la aplicación tendremos que añadir una nueva entrada en la BD. El comando que emplearíamos seria el siguiente:

INSERT INTO `nimitz`.`COM_ENUMERADOS` (`ID`, `C_NOMBRE`, `C_TEXTO`, `N_POSICION`, `C_OBSERV`) VALUES(1000700, 'TSesAgMotDesc', 'Nombre Motivo de desconexión', 60, ' ');

El ID debe ser mayor o igual a 1000700 y menor a 1000800. El N_POSICION debe ser mayor o igual a 60 y menor que 100.

3.2 Ocasionalmente No saltan los formularios en VIVAit Suite cuando existen marcadores

En los sistemas con marcadores, se ha observado que, en un porcentaje muy bajo, cuando entra una llamada a un agente no se presenta el formulario. En una traza del vivait-desk se pudo comprobar que no había eventos CTI de la llamada, pero telefónicamente la llamada si quedaba establecida.

El problema viene ocasionado porque el CTI tiene auditorías para descartar llamadas,evitando que se queden enganchadas.

Una de esas auditorías es el tiempo máximo de las llamadas no contestadas.

El marcador tiene puesto a fuego que el tiempo que permanece una llamada en cola a la espera de un agente libre es de 10 minutos.

Hay que poner el tiempo de auditoría en un valor superior (por ejemplo 12 minutos)

En el archivo de configuración vivait-cti.conf

audit_call_minutNoContestada = 12

El paŕametro audit_call_minutContestada, es el tiempo que el cti "conserva" una llamada, dado que el dialplan tiene puesto el timeout absolute a 7200 (120 minutos), deberiamos modificar este parámetro para que esté sincronizado

audit_call_minutContestada = 120

Estos cambios se implementarán en el instalador de la próxima versión (3.6.0.).

Ir arriba

4 ZABBIX

4.1 Como crear un TRIGGER en Zabbix

1. Hay dos posibilidades dependiendo si el trigger es para un solo host o es para varios, los cuales tienen en común un template:

  1. Si es para un host: Ir a Configuración/Hosts
  2. Si es para un template: Ir a Configuración/Templates

2. En la fila correspondiente al host/template al que queramos añadirle el trigger, pulsar sobre la columna triggers.
3. En la ventana de triggers, pulsar sobre el botón Create trigger, situado en la esquina superior derecha.
4. Aparecerá la ventana de creación de triggers, que tiene los siguientes campos:

1. Name: Nombre del trigger, que deberá ser lo suficientemente descriptivo. Aparecerá cuando se

active, en la ventana principal de Zabbix así como en los correos de aviso.

2. Expression: Define la fórmula cuyo resultado activará el trigger. Hay que pulsar el botón Add. Se mostrará una

nueva ventana donde habrá que elegir el item (medida) sobre el que se basará el trigger (evidentemente la medida deberá existir previamente) y la función necesaria para el cálculo. Para una descripción de las disponibles dirigirse a https://www.zabbix.com/documentation/2.2/manual/appendix/triggers/functions.
Tras rellenar los campos anteriores y dar a la función los valores que necesite pulsar el botón Insert.

3. Expression constructor: Permite crear expresiones complejas, uniendo varias.
4. Description: Una explicación del trigger
5. Severity: Criticidad el trigger
6. Para una descripción del resto de campos visitar la página: https://www.zabbix.com/documentation/2.2/manual/config/triggers/trigger

5. Tras rellenar los campos, pulsar el botón Save.
6. Si el trigger se ha añadido en un template, aparecerá en todos los hosts que tienen el template configurado.
7. El trigger por si solo no envía ningún aviso, solo se activa si se cumple la expresión definida. Para enviar un aviso (normalmente un correo electrónico) cuando se active el trigger, será necesario definir una acción (Configuración/Actions).

NOTA.- Para consultar cualquier cuestión relativa a Zabbix, se encuentra a su disposición el manual: 
https://www.zabbix.com/documentation/2.2/manual

4.2 Monitorización en Zabbix de un trunk caído

Para monitorizar un o varios trunk por separado y saber el estado de cada uno es necesario lo siguiente:

  • Añadir el UserParameter adjunto que contiene el siguiente texto:
UserParameter=asterisk.trunkEstado[*],sudo /usr/sbin/asterisk -rx 'sip show peers' | grep  --text -i '$1' |  grep OK >/dev/null; if [ $? -eq 0 ]; then echo 1; else echo 0; fi
  • Añadir en el portal de zabbix un item por cada trunk. En el campo Key se pondrá "asterisk.trunkEstado[nombre_trunk]", donde nombre_trunk es el nombre del trunk tal y como se ve en Asterisk.

Zabbix item trunkEstado.png


  • Crear un trigger que avise cuando el último valor sea 0. Por ejemplo:
{corp-bdtr:asterisk.trunkEstado[PrePro-ACD].last()}=0


Zabbix trigger trunkEstado.png

Ir arriba

5 AGENDAS

5.1 Agendas en terminales Yealink

En la agenda se mostrará como nombre lo que contenga el campo CEN_AGENDAS.C_NOMBRE_MOSTRAR y como teléfono el indicado en CEN_AGENDAS_TELEFONOS.C_TELEFONO Para hacer funcionar la agenda:

  • En el archivo de aprovisionamiento correspondiente (Yealink-XXXX-comun.cfg) establecer los siguientes parámetros:
   remote_phonebook.data.1.url = http://<direc IP>/vivait-agenda/yealink/contactData1.xml 
   remote_phonebook.data.1.name = NOMBRE DE LA AGENDA EN EL TELEFONO
  • En el archivo /etc/apache2/apache2.conf añadir tras el último Directory:
   <Directory /var/www/html/vivait-agenda/>
            AddType application/x-httpd-php .xml
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
   </Directory>
  • Ejecutar el comando:
   /etc/init.d/apache2 reload

5.2 Como ver sólo los contacto de una sede

5.2.1 Terminales Yealink

Tenemos que crear en el directorio de agenda de Yealink (/var/www/html/vivait-agenda/yealink/) un nuevo fichero .xml.

Modificar SEDE por la sede que queramos consultar. En el portal al crear un contacto debemos rellenar la variable empresa con el nombre de la sede.

En la plantilla de aprovisionamiento debemos poner la URL a este fichero .xml en la parte de phonebook.

5.2.2 Terminales CIsco

Para implementar esta facilidad en terminales Cisco tenemos que modificar el fichero index.php añadiendo:

array('Name' => 'Todo el directorio',
'URL' => $Server.'/PhoneDirectorySede.php?USU_ID='.$_SESSION['USU_ID'])
));

Creamos el fichero PhoneDirectorySede.php

No es necesario modificar el fichero de aprovisionamiento.


5.3 Como solucionar un fallo en agendas de yealink y grandstream provocado por instalar v.7 de php

Hay que modificar el fichero php MySQL.php acorde con la nueva versión 7 de php:

<?php
class Servidor_Base_Datos
{
	private $servidor;
	private $usuario;
	private $pass;
	private $base_datos;
	private $descriptor;

	function __construct($host="BDTR",$user="nimitz",$password="ivivanimitz",$db="nimitz")
	{
		$this->servidor = $host;
		$this->usuario = $user;
		$this->pass = $password;
		$this->base_datos = $db;
		//$this->conectar();
	}
	private function conectar()
	{
		//$this->descriptor = mysql_connect($this->servidor,$this->usuario,$this->pass);
		$mysqli = new mysqli($this->servidor,$this->usuario,$this->pass,$this->base_datos);
		if (!$mysqli) {
		   echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
   		   echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
   		   echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
   		   exit;
		}
		$mysqli->set_charset("utf8");
		//mysql_set_charset('utf8',$this->descriptor);
		//mysql_query("SET NAMES 'utf-8'",$this->descriptor);
		//mysql_select_db($this->base_datos,$this->descriptor);
	}
	public function consulta($consulta)
	{
		$mysqli = new mysqli($this->servidor,$this->usuario,$this->pass,$this->base_datos);
                if (!$mysqli) {
                   echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
                  echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
                  echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
                  exit;
               }
               $mysqli->set_charset("utf8");
		//$this->resultado = mysql_query($consulta,$this->descriptor);
		$this->resultado = $mysqli->query($consulta);
		//if (!$this->resultado) {
		//die('Invalid query: '. $consulta . mysql_error());
		
	}
	public function extraer_registro()
	{
		if ( $fila = mysqli_fetch_array($this->resultado,MYSQLI_ASSOC)) 
		{
			return $fila;
		} 
		else 
		{        
			return false;
		}
	}
}
?>


5.4 Como configurar el acceso a la agenda de Grandstream a través de HTTPS

Habitualmente el acceso a la agenda es http://${IP_NODO01}/vivait-agenda/grandstream/, pero es posible configurar este acceso para que sea https://${IP_NODO01}/vivait-agenda/grandstream/.

Para hacer este cambio tendremos que hacer lo siguiente:

  • Habilitar el modulo ssl de apache: a2enmod ssl
  • Crear directorios donde guardaremos el certificado y la clave
cd /etc/apache2/
mkdir crt
mkdir key
  • CREAR CERFIFICADOS AUTO-FIRMADOS EN CASO DE QUE EL CLIENTE NO TENGA:
  • Crear una llave privada. La llave privada nos será útil para la generación del certificado. Una vez creado, nuestro certificado SSL dependerá de esta llave para la implementación del mismo en cualquier servicio que requiera una conexión segura.
openssl genrsa -out server.key 1024
  • Crear un CSR (Certificate Signing Request). Un CSR es la base para un certificado SSL, en el se definen datos como el dominio,organización, ubicación, información de contacto, entre otros.
openssl req -new -key server.key -out server.csr
  • Generar el certificado SSL.

Para generar el certificado SSL vamos a necesitar tanto la llave privada como el CSR que acabamos de crear.

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  • Copiar el archivo server.crt a la carpeta /etc/apache2/crt/ y el archivo server.key /etc/apache2/key
  • Tenemos que habilitar el módulo de SSL en Apache.
a2enmod ssl
  • Damos de alta el sitio por defecto del ssl.
a2ensite default-ssl.conf
  • Editamos el fichero default-ssl.conf y lo ajustamos.
vi /sites-enabled/default-ssl.conf


SSLCertificateFile /etc/apache2/crt/server.crt
SSLCertificateKeyFile /etc/apache2/key/server.key

/etc/init.d/apache2 stop
/etc/init.d/apache2 start

Ir arriba

6 CALENDARIOS

6.1 Enrutamiento inteligente

Ante una llamada a un destino, si hay cita de ocupado en el calendario se desvia al número indicado en el campo "location" del calendario o a su buzon de voz si hay valor en dicho campo

same => n,Set(CalendarBusy=${CALENDAR_BUSY(GoogleCalendar)})
same => n,Set(id=${CALENDAR_QUERY(GoogleCalendar)})
same => n,NoOP(hay ${CALENDAR_QUERY_RESULT(${id},getnum)} eventos)
same => n,Verbose(3,The state of GoogleCalendar is $
{DEVICE_STATE(Calendar:GoogleCalendar)})
same => n,Set(CalendarLocation=${CALENDAR_QUERY_RESULT(GoogleCalendar,location)})
same => n,GotoIf($["${CalendarBusy}"=="1"]?:conCategoria)
same => n,GotoIf($["${CalendarLocation}"==""]?buzon)
same => n,Goto(Cen_iniLlam,${CalendarLocation},1)
same => n(buzon),Playback(Particular/buzon)
same => n,Hangup
same=> n(conCategoria),Goto(Cen_iniLlam,${EXTEN},1)

6.2 Conexión de cliente Outlook a calendarios VIVAit mediante Caldav

Por defecto, el cliente outlook no soporta Caldav; si queremos disponer de calendarios de VIVAit en Outlook tendríamos dos opciones:

  1. Tener los calendarios en el servidor Exchange
  2. Instalar un plugin en el cliente outlook que permita conectar vía Caldav los calendarios que estén ubicados en el servidor de calendarios de VIVAit

Este howto se centra en esta segunda posibilidad

Procedimiento:

1.- Instalar Calldavsincronizer (valdrían otros plugin de Caldav para Outlook)

https://sourceforge.net/projects/outlookcaldavsynchronizer/

2.- Entrar en Synchronization Profiles en la nueva pestaña Calldav Syncronizer de outlook Syncronizer.png


3.- Añadir nuevo perfil (tecla +)


Nuevo.png


A tener en cuenta:

  • Crear un nuevo “Outlook folder”, entendemos que es adecuado (quizás necesario) para que las entradas de calendario de VIVAit queden diferenciadas.
  • Lo mejor es haber creado antes el calendario en el servidor para que al darlo de alta en oulook comprobemos que se conecta.
  • Dando al botón “Test or discover settings” se nos muestran todos los calendarios del servidor y elegimos el que queramos; en “elementos de la carpeta” diremos “elementos de calendario”.


Calendario.png

Ir arriba

7 USO DE RELOJ HARDWARE EN NODOS DE PROCESAMIENTO

7.1 En nodo de procesamiento ACD

En un nodo de procesamiento ACD es obligatorio instalar dahdi y una tarjeta de primario para emplear reloj hardware, ya que el reloj software que va en el asterisk 1.4 es defectuoso. Para configurarlo basta con instalar la tarjeta en el servidor, instalar dahdi y posteriormente ejecutar el siguiente comando:

dahdi_cfg

Este comando generaŕa el fichero /etc/dahdi/system.conf

Para comprobar que el comando se ha ejecutado satisfactoriamente lo abriremos y tendrá que tener un formato semejante al siguiente ejemplo:

# Autogenerated by /usr/sbin/dahdi_genconf on Tue Oct 22 17:42:59 2013
# If you edit this file and execute /usr/sbin/dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" HDB3/CCS/CRC4
span=1,1,0,ccs,hdb3,crc4
# termtype: te
bchan=1-15,17-31
dchan=16
echocanceller=oslec,1-15,17-31
# Global data
loadzone        = es
defaultzone     = es

7.2 En nodo de procesamiento de corporativa

En un nodo de procesamiento de corporativa no obligatorio instalar dahdi y una tarjeta de primario para emplear reloj hardware, ya que el no se han detectado errores en el reloj por software. Sin embargo si instalamos dahdi y una tarjeta de primario para emplear reloj hardware, el sistema funcionará mejor. Para configurarlo basta con instalar la tarjeta en el servidor, instalar dahdi y posteriormente ejecutar el siguiente comando:

dahdi_cfg

Este comando generaŕa el fichero /etc/dahdi/system.conf

Para comprobar que el comando se ha ejecutado satisfactoriamente lo abriremos y tendrá que tener un formato semejante al siguiente ejemplo:

# Autogenerated by /usr/sbin/dahdi_genconf on Tue Oct 22 17:42:59 2013
# If you edit this file and execute /usr/sbin/dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" HDB3/CCS/CRC4
span=1,1,0,ccs,hdb3,crc4
# termtype: te
bchan=1-15,17-31
dchan=16
echocanceller=oslec,1-15,17-31
# Global data
loadzone        = es
defaultzone     = es

Ir arriba

8 APROVISIONAMIENTO TERMINALES CISCO

8.1 Configurar protocolo SIP TCP o UDP en terminal Cisco

Configuración de terminal Cisco para para funcionar bajo TCP o UDP: Modificar parámetro

<transportLayerProtocol>X</transportLayerProtocol>

Donde X es:

   1: TCP
   2: UDP
   4: Valor por defecto del firmware (al menos en la última versión equivale a TCP)

8.2 Habilitar/Deshabilitar llamada en espera en terminales Cisco

En el fichero de aprovisionamiento del terminal añadiremos la siguiente linea

<callWaiting>X</callWaiting>

Donde X es:

  0=off but can be changed through the settings menu.
  1=on but can be changed through the settings menu.
  2=off and locked so it can't be changed through the settings menu.
  3=on and locked so it can't be changed through the settings menu.

9 FOP2

9.1 Como mostrar callername queues FOP2

Es necesario añadir el siguiente código al contexto de entrada:

exten => _X.,n,MYSQL(Connect connid localhost usuario clave bd)
exten => _X.,n,MYSQL(Query resultid ${connid} SELECT\ firstname\,lastname\ from\ fop2\ where\ phone1=${CALLERID(num)}\ OR\ phone2=${CALLERID(num)})
exten => _X.,n,MYSQL(Fetch fetchid ${resultid} nombre apellidos)
exten => _X.,n,GotoIf($[${fetchid} = 1]?:noExiste)
exten => _X.,n,Set(CALLERID(name)=${nombre}${apellidos})
exten => _X.,n(noExiste),Continuar

En la primera línea cambiar según lo necesario:

  • localhost: Dirección IP del servidor de MySQL donde está la BBDD de FOP2
  • usuario: Usuario con permisos de acceso a la bbdd de FOP2
  • clave: Clave del usuario
  • bd: Nombre de la BBDD


9.2 FOP2. Problemas en transferencias asistidas en llamadas salientes

Para habilitar al transferencia atendida hay que añadir al Dial la opción T. Ejemplo en maqueta homologación:

same => n,Dial(${ENR_CADMARCAR},40,TkeU(Cen_Marcar_Extension_Dial_Gosub,s,1))

9.3 FOP2. Problemas en transferencias asistidas

Para habilitar la transferencia atendida del asterisk (funcion atxfer), hay que poner la opción tT en el queue() si la llamada origen 
la realiza a una cola o  al dial() de las extensiones.
Con eso vemos como al intentar hacer la llamada de consulta ya se va a nuestro dialplan. Sin embargo la llamada no funciona ya que 
el enrutador nos da error de  enrutamiento porque no tenemos ID_DISPOSITIVO origen ya que el fop no es un elemento creado desde el portal.
Por lo que se propone como solución crear un contexto de inicio del fop y asignarle un ID_DISPOSITIVO para que así se enrute la llamada. 
El contexto tienen que ser similar a ext_InicioLlamada_Chrome.conf

Para que funcione las transferencias supervisadas desde el fop2 hay que realizar lo siguiente:

  • El usuario del manager debe tener permisos Atxfer para poder realizar transferencias.
  • Habilitar la transferencia atxfer en el fuatures.conf del asterisk. atxfer => *2
  • Crear el fichero ext_InicioLlamada_FOP.conf con el siguiente contenido:
[Cen_Inicio_FOP]
exten => [*#%0-9].,1,NoOp(MDINICHR**EXTEN=${EXTEN}**CID=${CHROME_ANI}*)
same => n,dumpchan()
;same => n,Set(CALLERID=${CHROME_ANI})
same => n,Gosub(Cen_Sub_getIdExtension,s,1(${R_CID_NUM_00}))
same => n,ExecIf($["${GOSUB_RETVAL}"!="OK" | "${sqlDato}"=""]?HangUp)
same => n,Set(ID_DISPOSITIVO=${sqlDato})
; . Modificar MARCAR en funcion de reglas de marcacion saliente (prefijo 0, ...)
; Esto se modificara en el contexto Cen_Inicio_Chrome_Particular
same => n,Set(MARCAR=${EXTEN})
;---------------------------------


;--- Llamada a contexto particular
;---------------------------------
; Esta llamada es para hacer cosas especificas del cliente (cambiar callerid...)
; La subrutina Cen_Inicio_Chrome_Particular esta en el archivo ext_InicioLlamada_Chrome_Particular.conf
; Si no existe el archivo copiar el archivo ext_InicioLlamada_Chrome_Particular.conf.ejemplo como ext_Inicio_Chrome_Particular.conf
; y realizar las modificaciones necesarias
; El fichero ext_InicioLlamada_Chrome_Particular.conf se carga automaticamente al ser creado con el include de ext_InicioLlamada.conf
; #include "ext_InicioLlamada*.conf"
;
same => n,GosubIf($[${DIALPLAN_EXISTS(Cen_Inicio_FOP_Particular,${EXTEN},1)}>0]?Cen_Inicio_FOP_Particular,${EXTEN},1)
same => n,Goto(Cen_Inicio_SIP,${MARCAR},1)
  • En el fichero /usr/local/fop2/buttons.cfg poner como contexto de las extensiones el creado anteriormente (Cen_Inicio_FOP)
  • Modificar el fichero /usr/local/fop2/fop2.cfg:
blind_transfer = 0
supervised_transfer = 1

Para realizar la transferencia con consulta, hay que pulsar el supervised transfer del FOP2 y una vez se haya establecido la llamada, seleccionar la extensión que "sobra" en la conversación y pulsar la tecla de hangup y colgar la llamada.

9.4 Como monitorizar extensiones ubicadas en nodos diferentes desde FOP2

Para añadir una nueva PBX al fop hay que añadir al fichero fop2.cfg

; Server Corp0
manager_host=localhost
manager_port=5038
manager_user=fop2
manager_secret=fop222
; Server Corp1
manager_host=172.25.128.92
manager_port=5038
manager_user=fop2
manager_secret=fop222

Para cada una de las PBX que se quiera añadir.

Añadir el usuario del manager de asterisk al Nodo, Ejemplo:

[fop2]
secret = fop222
writetimeout = 500
;deny=0.0.0.0/0.0.0.0
;permit=209.16.236.73/255.255.255.0
read = transfer,dial,system,call,log,verbose,command,agent,user,config,originate,Atxfer
write = transfer,dial,system,call,log,verbose,command,agent,user,config,originate,Atxfer

Después hay que indicar a que server pertenece cada botón, ejemplo:

[SIP/40001]
type=extension
extension=40001
context=Cen_Inicio_FOP
label=Zoiper
mailbox=40001@default
extenvoicemail=40001@default
channel=SIP/40001
server=172.25.128.91
[SIP/43000]
type=extension
extension=43000
context=Cen_Inicio_FOP
label=43000
mailbox=43000@default
extenvoicemail=43000@default

Para las colas:

  • Hay que añadir el parámetro server para aquellas que NO pertenecen al Asterisk en el que está instalado el FOP2.

Ejemplo:

[QUEUE/80001]
type=queue
label=Prueba
extension=80001
context=Cen_Inicio_SIP
[QUEUE/80002]
type=queue
label=Prueba
extension=80002
context=Cen_Inicio_SIP
server=172.25.128.92
channel=SIP/43000
server=172.25.128.92

La transferencia con consulta y la supervisión funcionan correctamente.

Para que la transferencia ciega a una extensión de otro servidor funcione se añade al principio del contexto:

[Cen_Inicio_FOP]
same => n,GotoIf($["${ENR_PEER_ORIGEN}"!=""]?Cen_Transfer,${EXTEN},1).

Si una extensión tienen doble registro, en el fichero button.cfg se añadirán tantas entradas server como nodos de registro tenga.


Ejemplo: En el FOP2 de homologación serán dos entradas de server, uno el primario y otro el secundario:

[SIP/40001]
type=extension
extension=40001
context=Cen_Inicio_FOP
label=Zoiper
mailbox=40001@default
extenvoicemail=40001@default
channel=SIP/40001
server=172.25.128.91
server=172.25.128.92

Para resolver el error en transferencias entre nodos, en el [Cen_Inicio_FOP] hay que sustituir el GotoIf por:

same => n,GotoIf($[$["${ATTENDEDTRANSFER}"=""]&$["${ENR_PEER_ORIGEN}"!=""]]?Cen_Transfer,${EXTEN},1)

Para resolver el error en transferencias ciegas con origen en el mismo nodo, en el [Cen_Inicio_FOP] sustituir el GotoIf por:

same => n,GotoIf($["${ATTENDEDTRANSFER}"=""]?Cen_Transfer,${EXTEN},1)

Para soportar la carga de eventos del manager, hay que modificar el usuario fop2 del manager de asterisk de la siguiente forma:

http://forum.fop2.com/index.php/3722-make-fop2-snappier-using-ami-eventfilter

Se resuelve el error en llamadas originadas desde el fop, en el [Cen_Inicio_FOP] sustituir el GotoIf por:

same => n,GotoIf($[$["${ATTENDEDTRANSFER}"=""]&$["${TRANSFER_CONTEXT}"!=""]]?Cen_Transfer,${EXTEN},1)

Se resuelve el error en llamadas tranferidas ciegamente desde origen otro nodo, en el [Cen_Inicio_FOP] sustituir el GotoIf por:

same => n,GotoIf($[$["${ATTENDEDTRANSFER}"=""]&$["${UCID}"!=""]]?Cen_Transfer,${EXTEN},1)

9.5 Como configurar el parking de llamadas desde el FOP2

No es necesario crearse la facilidad ni la preruta, se hace todo directamente desde el fop2. No es necesario tampoco crearse los speed dial del terminal, se hace todo por la web.

Para poder realizarlo hay que añadir al fichero ext_InicioLlamada_FOP.conf:

[fop2-park]

exten => _X.,1,NoOp(MDINIFOP****EXTEN=${EXTEN}**CID=${CALLERID}**UCID=${UCID}*)

same =>        n,Park(default,)

include => Cen_finLlamada


1Captura de pantalla de 2018-04-03 08 27 57.png


2Captura de pantalla de 2018-04-03 08 28 24.png


3Captura de pantalla de 2018-04-03 08 28 37.png


4Captura de pantalla de 2018-04-03 08 28 54.png


9.6 Como integrar la agenda con el directorio corporativo de VIVAit en FOP2

Hay que crear dos cron.d con el siguiente contenido:

cron.d #1

HELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

   m h dom mon dow user command
   0 3 * * * root /usr/local/sbin/contactosFOP.sh

El contenido de contactos FOP.sh es:

rm /tmp/visphonebak.db
mysql -u root -pivivamysql < /tmp/visual_phonebook.sql

cron.d #2

HELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

   m h dom mon dow user command
   1 3 * * * root wget http://10.10.19.6/fop2/phonebook.php

config.php

phonebook.php

10 BASE DE DATOS

10.1 Como borrar contenido de la tabla BDTR con el script borraRegistrosNimitz.pl

Este script se ejecuta mediante una tarea del crontab, tal como la siguiente:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user  command
00 01     * * *   root    /usr/local/sbin/borraRegistrosNimitz.pl --hDB localhost

Para establecer el número de días que vamos a dejar en la base de datos debemos editar el archivo borraRegistrosNimitz.pl, el campo my $numDias.


10.2 Problemas en la bbdd de replica, tabla COM_COMUNICADOS

De forma intermitente en esta tabla se generan registros duplicados y hay que borrar registros y arrancar la Réplica para que todo vuelva a funcionar.

El problema consiste en el el script borraRegistrosNimitz.pl borra la tabla entera, sin tener en cuenta el número de días que queremos dejar de backup; esto provoca que se vuelvan a repetir los índices de la BD.

Hay que modificar el script de la siguiente forma:


dentro de la sentencia elsif($tablas[$i] eq "COM_COMUNICADOS")

Hay que sustituir la sentencia

$query = "DELETE FROM $tablas[$i;

Por esta otra:

$query = "DELETE FROM $tablas[$i] where D_HORA_FIN < DATE_SUB(NOW, INTERVAL $numDias DAY) LIMIT 100";

Ir arriba

11 CHAT

11.1 Como solucionar un problema del servicio chat cors filter

Para habilitar el cruce de dominio hay que añadir la siguiente configuración al fichero web.xml del ChatWebService.

    <filter>
          <filter-name>CorsFilter</filter-name>
          <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
          <init-param>
            <param-name>cors.allowed.origins</param-name>
            <param-value>*</param-value>
          </init-param>
          <init-param>
            <param-name>cors.allowed.methods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
          </init-param>
          <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control- Request-Headers</param-value>
          </init-param>
          <init-param>
            <param-name>cors.exposed.headers</param-name>
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
          </init-param>
          <init-param>
            <param-name>cors.support.credentials</param-name>
            <param-value>true</param-value>
          </init-param>
          <init-param>
            <param-name>cors.preflight.maxage</param-name>
            <param-value>10</param-value>
          </init-param>
    </filter>
    <filter-mapping>
          <filter-name>CorsFilter</filter-name>
          <url-pattern>/*</url-pattern>
    </filter-mapping>


11.2 Como solucionar el problema cuando el mensaje es: Se ha detectado un chat abierto. Se cerrará y tendrá que iniciar un nuevo chat.

Cuando cerramos un Chat y queremos volver a establecerlo, en ocasiones, la aplicación del usuario muestra un mensaje en pantalla:

Error CHAT.jpg

En esta situación el problema se arregla cerrando el navegador en el que hemos abierto la aplicación de usuario.

Al abrir de nuevo el navegador el usuario se loga y es posible establecer el Chat.

Ir arriba

12 COMO TENER ESTADÍSTICAS DE LLAMADAS CON VIVAit Call

12.1 Asternic

Hemos probado la solución Asternic, opensource que ofrece estadísticas de llamadas en un sistema VIVAit Call.

Aunque se solucionamos errores que aperecian al instalar la solución en Ubuntu 16, al final hemos optado por instalar la versión de pago, junto a la version php27.

Para más información consultar petición #7830 y http://www.asternic.org/

Ir arriba