Howto's
Producto: | VIVAit Call
VIVAit Suite VIVAit Fax |
---|
Sumario
- 1 OPERACIONES DE SISTEMAS
- 1.1 Como parar asterisk
- 1.2 Como comprobar las versiones de los elementos de la plataforma
- 1.3 Cancelación de eco en la plataforma
- 1.4 Generación de un Core
- 1.5 Consideraciones VIVAit Call Activo-Activo
- 1.6 Conexion de terminales a VIVAit mediante OpenVPN
- 1.7 Generación de llamada automática
- 1.8 Instalación de ActivaSTP con VIVAit Call 3 y marcación desde Outlook
- 1.9 Envío de variables CTI al ACD ante un GW con asterisk 13
- 1.10 Como volver a procesar grabaciones con error
- 1.11 Como ver los directorios de un NAS a montar con NFS
- 1.12 Simple_bridge y native_rtp
- 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
- 1.14 Como se muestra el número llamante en transferencia desde operadora
- 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"
- 1.16 Como solucionar problemas de deslogado de un agente en los grupos de salto
- 1.17 Como solucionar que cuando las llamadas entran por el GW los desvios por no contesta no actúan
- 1.18 Como insertar y/o actualizar más de 100 locuciones utilizando el portal de administración
- 1.19 Funcionamiento de SerCen con nat en versión 3.6 de VIVAit
- 2 CONFIGURACIONES
- 2.1 043 ERROR Permisos MySQL:180 - Error SQL
- 2.2 Error cuando exportamos contactos con un script
- 2.3 Como configurar la megafonía
- 2.4 Como configurar el candado
- 2.5 Como configurar los portales web en HTTPS
- 2.6 Actualización de vmware_tools en los sistema Asterisk
- 2.7 Como configurar servicio DHCP en Ubuntu Linux
- 2.8 Como configurar el "parking" de llamadas por parte de la operadora
- 2.9 Como configurar que los tonos dtmf no sean regenerados por Asterisk
- 2.10 Como configurar protocolo Skinny en VIVAit Call mediante uso de Chan-SCCP
- 2.11 Como crear un grupo de captura y que se vea en cada teléfono el número que llama
- 2.12 Instalación y configuración Postfix en RedHat7
- 2.13 Como realizar una ampliación de disco duro en un entorno virtual
- 2.14 Como crear supletorios
- 2.15 Añadir Auto-Answer a la cabecera SIP
- 2.16 Activación de la movilidad para un usuario
- 2.17 Script para cambio automático de claves en salas de conferencia estáticas
- 2.18 Como modificar el tiempo de desvío por No Contesta, en la extensión
- 2.19 Como conseguir que cuando una llamada se abandone en cola se envíe un correo con la información de la llamada
- 2.20 Como tener extensiones del mismo rango de numeración en dos nodos de VIVAit Call
- 2.21 Como modificar el tiempo del desvío por no contesta sin que afecte al ring estándar de 40 segundos
- 2.22 Como mostrar la existencia de un desvío en terminales GrandStream
- 2.23 Como configurar el sistema para que reproduzca una locución en llamadas salientes que se graban
- 2.24 Como configurar el sistema cuando existe una máquina dedicada a las grabaciones
- 2.25 Como configurar el sistema para que Asterisk deje pasar los tonos
- 2.26 Como solucionar problemas de seguridad en servicio de directorio para agendas de terminales
- 2.27 Como solucionar problemas de enrutamiento en terminales con doble registro
- 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
- 2.29 Como configurar el Lanzador.ini para permitir que haya dos repositorios en la misma máquina
- 2.30 Integración con H.323
- 2.31 Instalación de un trunk sip de VODAFONE sin SBC
- 2.32 Como configurar VIVAit Fax para que funcione T38 con g729
- 2.33 Como pasar a SIP sobre TCP
- 2.34 Como optimizar la creación de VDN's
- 2.35 Como configurar la grabación de llamadas entre agentes
- 2.36 Como configurar que en los grupos corporativos se generen las extensiones en el Nodo Secundario
- 3 VIVAit Suite
- 4 ZABBIX
- 5 AGENDAS
- 6 CALENDARIOS
- 7 USO DE RELOJ HARDWARE EN NODOS DE PROCESAMIENTO
- 8 APROVISIONAMIENTO TERMINALES CISCO
- 9 FOP2
- 9.1 Como mostrar callername queues FOP2
- 9.2 FOP2. Problemas en transferencias asistidas en llamadas salientes
- 9.3 FOP2. Problemas en transferencias asistidas
- 9.4 Como monitorizar extensiones ubicadas en nodos diferentes desde FOP2
- 9.5 Como configurar el parking de llamadas desde el FOP2
- 9.6 Como integrar la agenda con el directorio corporativo de VIVAit en FOP2
- 10 BASE DE DATOS
- 11 CHAT
- 12 COMO TENER ESTADÍSTICAS DE LLAMADAS CON VIVAit Call
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
- Ejemplos puertos demonios:
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:
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.
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.
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.
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.
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:
Para que la movilidad funcione hay que asignar un teléfono a la extensión, quedando la configuración de esta manera:
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.
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.).
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:
- Si es para un host: Ir a Configuración/Hosts
- 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.
- Crear un trigger que avise cuando el último valor sea 0. Por ejemplo:
{corp-bdtr:asterisk.trunkEstado[PrePro-ACD].last()}=0
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
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:
- Tener los calendarios en el servidor Exchange
- 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
3.- Añadir nuevo perfil (tecla +)
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”.
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
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
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
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";
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:
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.
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/