miércoles, 28 de diciembre de 2011

Restricción de llamadas por interno.



En este documento detallaremos los pasos necesarios para configurar la restricción de llamadas de un  interno. En este ejemplo veremos como restringir que el interno 2002 solo pueda llamar a los internos 2001 y 2004.
En el archivo/etc/asterisk/extensions.conf agregamos las siguientes líneas

Creamos el contexto restringidos
[restringidos]
exten => 2001,1,dial(sip/2001)
exten => 2004,1,dial(sip/2004)
exten => _2xxx,1,Playback(pbx-invalid)                        


En el archivo /etc/asterisk/sip.conf agregamos en el contexto 2002 que es el interno que queremos restringirle las llamadas, la línea context=restringidos que es a donde le decimos que pertenece este interno.

[2002]
type=friend
callerid=Compras <2002>
host=dynamic
context=restringidos
secret=9876
;disallow=all
allow=alaw
allow=ulaw
allow=gsm
mailbox=2002@default


 


Diagrama de funcionamiento de restricción de llamada




Cómo funciona la restricción de llamada.

1-      En este ejemplo mostramos como una llamada desde el interno 2002 puede llamar al interno 2001. Cuando el usuario del interno 2002 quiera llamar a otro interno como por ejemplo, el 2003, se escuchara un mensaje diciendo que ese interno es invalido.

jueves, 15 de diciembre de 2011

Código de autorización “PIN”

En este documento detallaremos los pasos necesarios para que los usuarios puedan realizar llamados mediante una clave de acceso.

La idea para implementar el PIN es crear un archivo distinto por cada clase de servicio, por ejemplo los gerentes que tienen que tener permitido todo tipo de llamados se pondrán en el archivo TODOS, otros empleados que solo pueden llamar a teléfonos internos deberán ir en el archivo INTERNOS, y así sucesivamente lo mismo para llamadas para celulares, Nacionales, Internaciones.

Para realizar esta tarea seguiremos los siguientes pasos:

creamos el archivo /etc/asterisk/interno y agregamos los códigos autorizados para poder realizar llamadas a todos, fijos, celulares, etc.

1234567

2365489

1258741


agregamos las líneas en rojo en el contexto internal en el archivo /etc/asterisk/extension.conf.



[internal]exten => _2XXX,1,Answer() ; contestamos la llamada

exten => _2XXX,n,Authenticate(/etc/asterisk/todos) ; pide codigo

exten => _2XXX,n,Playback(pin-number-accepted)

exten => _2XXX,n,Set(NUM=${DB(${EXTEN}/FORW)}) ;

exten => _2XXX,n,GotoIf($["${NUM}" = ""]?normal:forw) ;

exten => _2XXX,n(normal),Goto(${EXTEN},10) ; llamamos la extension

exten => _2XXX,n,Hangup() ; terminamos la llamada

exten => _2XXX,n(forw),DIAL(SIP/${NUM},60) ;

exten => _2XXX,n,Hangup() ; terminamos la llamada

realizamos un dialplan reload para recargar el dialplan.

Ratchet*CLI> dialplan reload


Diagrama de comportamiento de funcionamiento con PIN



 Cómo funciona el llamado con PIN.

En el ejemplo vemos como una extensión 2002 llama al interno 2001, cuando el usuario marca el interno destino, la operadora le pedirá que ingrese el interno seguido de la tecla “#”, si el PIN es correcto realiza la llamada al destino, si el PIN es incorrecto la operadora le avisa que el PIN es incorrecto que vuelva a ingresarlo y así seguir con la secuencia menciona anteriormente.

No Molestar/ Do not disturb

En este documento detallaremos los pasos necesarios para configurar la función de no molestar o do not disturb. El do not disturb nos permite no ser molestado por llamadas telefónicas pero permitiendo que si alguien nos llame puede dejarnos un mensaje en el contestador.

En el archivo/etc/asterisk/extensions.conf agregamos las siguientes líneas:






 [phones]

include => internal

[internal]

;;;;;desvio de llamada,


exten => _2XXX,1,Answer() ; contestamos la llamada

exten => _2XXX,n,Set(NUM=${DB(${EXTEN}/FORW)})

exten => _2XXX,n,GotoIf($["${NUM}" = ""]?normal:forw)

exten => _2XXX,n(normal),Goto(${EXTEN},8) ; enviamos a la línea 8

exten => _2XXX,n,Hangup() ; terminamos la llamada

exten => _2XXX,n(forw),DIAL(SIP/${NUM},60) ;

exten => _2XXX,n,Hangup() ; terminamos la llamada

;;;;; do not disturb

exten => _2XXX,n,GotoIf(${DB_EXISTS(DND/${EXTEN})}?DND-ON)

exten => _2XXX,n,Dial(SIP/${EXTEN},20,t) ; DND is OFF, start dialing

exten => _2XXX,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)

exten => _2XXX,n(busy),Voicemail(${EXTEN}@default,b)

exten => _2XXX,n,hangup

exten => _2XXX,n(unavail),Voicemail(${EXTEN}@default,u)

exten => _2XXX,n,hangup

exten => _2XXX,n(DND-ON),Goto(${EXTEN},13)

exten => h,1,Hangup

;;;; con 99 activo y desactivo el DND

exten => 99,1,Macro(DND)
exten => 99,n,Hangup

[macro-DND]

exten => s,1,GotoIf(${DB_EXISTS(DND/${CALLERID(num)})}?disable-dnd,1)

exten => s,n,Set(DB(DND/${CALLERID(num)})=1)

exten => s,n,playback(do-not-disturb)

exten => s,n,playback(activated)

exten => s,n,hangup

exten => disable-dnd,1,Set(DEL=${DB_DELETE(DND/${CALLERID(num)})})

exten => disable-dnd,n,playback(do-not-disturb)

exten => disable-dnd,n,playback(de-activated)

exten => disable-dnd,n,hangup

 

Explicación del contexto [internal] la parte de “do not disturb”

Si el registro existe en la base de datos de asterisk (línea 1) la llamada será enviada a la extensión con etiqueta DND-ON, y de ahí a la extensión _2XXX prioridad 13. Esto significa que la llamada será transferida al contestador y al llamante será anunciado que la persona en la extensión XXXX no se encuentra disponible y le dará la opción de dejar un mensaje.

Si el registro no existe se procesará la línea dos y se llamará la extensión marcada. Luego según esté ocupada o en otra condición, la llamada se enviará a la correspondiente parte del plan de llamadas

Explicación del contexto [macro-DND]

En la primera línea controlamos si en la base de datos de Asterisk existe un valor asociado a la familia DND y nuestro número de extensión (CALLERID). Si no existe lo creamos con la línea 2 y le asignamos el valor 1. Luego usamos las voces de asterisk para anunciar que “No disturbar” ha sido activado.

En el caso que el registro ya existe en la base de datos, el Gotoif nos llevará a la extensión disable-dnd, prioridad 1 donde borraremos el registro y anunciaremos que el “No disturbar” ha sido desactivado.

 

Diagrama de funcionamiento del do not disturb



 

Cómo funciona el DND (do not disturb).

 

1-      En este ejemplo mostramos como una llamada desde un interno cualquiera (2XXX) llama a la extensión 2002 donde el usuario activó el DND (do no disturb) presionando las teclas 99.  Como el interno 2002 tiene activada esta opción el llamante solo podrá dejar un mensaje en el buzón de mensajes del interno 2002.

2-      Si se desea desactivar esta opción se hace nuevamente oprimiendo las teclas 99.

 

jueves, 3 de noviembre de 2011

Directorio de llamado en asterisk

En este documento detallaremos los pasos necesarios para implementar un Directorio de llamado. Esto se utiliza por ejemplo cuando queremos llamar a alguien y no sabemos su interno. Supongamos que tenemos un IVR que nos recibe de la siguiente

“Gracias por comunicarse con   Mi Empresa SRL ….……para comunicarse con  Ventas marque 1… para  comunicarse con Soporte  marque 2 …. Para comunicarse con Administración  marque 3… para enviar un fax presione 4… para acceder al directorio presione 9  sino aguarde y será atendido por una operadora.”

Si seleccionamos la opción 9 nos aparecerá un mensaje que dirá:

“Bienvenido al directorio asterisk, por favor introduzca las 3 primeras letras del apellido de la persona que busca, por ejemplo 3 para la D o 5 para la L.”

Para configurar el directorio debemos realizar  los siguientes pasos:

Para agregar la opción 9, en el contexto  menu-dia en el archivo extensions.conf debemos agregar la línea exten => 9,1,Directory(default,phones,e)
[phones]
include => internal
[internal]
exten => _2XXX,1,Dial(SIP/${EXTEN},10) ; llamados de ext 2xxx
exten => _2XXX,n,VoiceMail(${EXTEN}@default,u)
exten => _2XXX,n,Playback(vm_goodbye) ; 
exten => _2XXX,n,Hangup() ; cuelga la comunicación
;llamando al interno 2000 entra al IVR segun el horario ejecuta el mensaje
exten => 2000,1,GotoIfTime(9:00-18:00|mon-fri|*|*?menu-dia,s,1)
exten => 2000,2,GotoIfTime(18:01-8:59|mon-fri|*|*?menu-noche,s,1) 
[menu-dia]
exten => s,1,Answer
exten => s,n,Wait(0.5)
exten => s,n,Background(menudia2) ; reproduce el mensaje grabado
exten => s,n,WaitExtend(5)
exten => 1,1,Goto(internal,2001,1);opcion 1 redirecciona a la ext 2001
exten => 2,1,Goto(internal,2002,1);opcion 2 redirecciona a la ext 2002
exten => 2,1,Goto(internal,2003,1);opcion 3 redirecciona a la ext 2003
exten => 9,1,Directory(default,phones,e) ;la opcion 9 redirige al directorio
exten => *,1,Goto(s,1) ; vuelve a reproducir el menu principal con la tecla asterisco
exten => t,1,Playback(goodbye) ; si esta mucho tiempo sin hacer nada despide y cuelga
exten => t,n,Hangup()
exten => i,1,Playback(pbx-invalid) ; si el numero digitado no es valido comunica el error
exten => i,n,goto(s,1) ;vuleve al menu principal del IVR

Se agrega la siguiente línea al contexto features.

[features]
exten => 2000,1,Goto(menu-dia,s,1) ; llamando a la ext 2000 ingresa al menu del IVR


Se agrega la siguiente línea al contexto default ubicado en /etc/asterisk/voicemail.conf



[default]

1234 => 4242,Example Mailbox,root@localhost
2001 => 1234,Ventas,pepe@midominio.com.ar
2002 => 1234,Compras,asterisk@midominio.com.ar
2003 => 1234,Soporte

TIPS= Siempre debemos definir los contactos en el voicemail para que puedan ser ubicados con la función Directory(), de lo contrario no ubicara a la persona.

 se realiza la prueba llamando al interno 2000 donde tendría que escucharse el IVR, 
elegimos la opción 9 y nos pedirá que ingresemos las 3 primeras letras del nombre de 
la persona/sector que deseamos ubicar, la operadora nos deletreara el nombre completo
con la extensión a la que pertenece y si es esa la extensión nos pide que pulsemos la tecla “1”.


Cómo funciona el IVR con directorio.

En este ejemplo veremos cómo utilizar el directorio si se desea llamar al sector Compras.

Una vez que ingresamos la opción 9, la operadora nos dice el siguiente mensaje:

“Bienvenido al directorio asterisk, por favor introduzca las 3 primeras letras del apellido de la persona que busca, por ejemplo 3 para la D o 5 para la L.”

1-      Ingresamos las 3 primeras letras del apellido o sector, en este caso “C”,”O”,”M”.

2-      La operadora nos deletrea el sector junto con el interno que tiene asociado. Deletreara los siguiente “C””O””M””P””R””A””S”… INTERNO ”2””0””0””2”.

3-      Si el nombre es el correcto presione la tecla “1” y se realizara la llamada a ese interno.

4-      En caso de que este mal el sector que nos informa presionaremos * para volver a realizar el paso 1.

La sintaxis para la función Directory es la siguiente:

exten => 9,1,Directory(default,phones,f) ;

default= contexto en el archivo voicemail.conf donde se declaran los contactos a ubicar

phones=contexto  de las llamadas internas en el archivo extensions.conf

f/e= la opción f realiza la búsqueda por apellido, y con la opción “e” por nombre

Rellamada en asterisk

En este documento detallaremos los pasos necesarios para configurar la función rellamada si el interno esta ocupado.  En este caso si llamamos a un interno que esta ocupado presionamos la tecla 6 para dejar la rellamada y cuando el mismo se desocupe le dará la opción  de aceptar la rellamada, si la misma es aceptada  llama al llamante indicando que el interno se ha desocupado.

En el archivo/etc/asterisk/extensions.conf agregamos las siguientes líneas
[local-sip]
include => training
exten => _4XXX,1,Macro(internos)
exten => _40XX,2,Playback(hello-world)
exten => _40XX,3,Hangup()
[macro-internos]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Set(ID=${CALLERID(num)})
exten => s,n,Dial(SIP/${MACRO_EXTEN},30,tTwmkKxX)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),Playback(rellamada)
exten => s,n,Read(callbusy,,1,,1,5)
exten => s,n,GotoIf($["${callbusy}" = "6"]?callfile)
exten => s,n,VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()
exten => s,n(callfile),System(echo Channel:SIP/${MACRO_EXTEN} >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Callerid:CallBack "<VozToVoice>" >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo WaitTime:30 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Maxretries:10 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo RetryTime:30 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Account: ${ID}>> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Application:Dial >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Data: SIP/${ID} >> /tmp/callback${MACRO_EXTEN})
exten => s,n,Wait(1)
exten => s,n,System(mv /tmp/callback${MACRO_EXTEN} /var/spool/asterisk/outgoing)
exten => s,n,Hangup()
exten => h,1,Hangup

NOTA: Debemos grabar el archive wav rellamada.wav y colocarlos en el directorio /var/lib/asterisk/sounds/es.

Definimos nuestro dialplan en [local-sip], cuando llamamos a un interno la línea exten => _4XXX,1,Macro(internos) salta a [macro-internos], esta macro si el interno esta ocupado nos da la opción de activar la rellamada si marcamos el numero 6.

Explicación de la  macro [macro-internos]

exten => s,1,Answer() ; asterisk contesta el canal

exten => s,n,Wait(1) ; espera un segundo

exten => s,n,Set(ID=${CALLERID(num)}); asigna a la variable ID el número de la extensión del llamante

exten => s,n,Dial(SIP/${MACRO_EXTEN},30,tTwmkKxX) ; llama la extensión

exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) ; si la extensión está ocupada va a la prioridad con etiqueta busy, si no está disponible a la prioridad con la etiqueta unavail

exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u) ; envía la llamada al contestador automático anunciando que la extensión no se encuentra disponible

exten => s,n,Hangup() ; cuelga la llamada

exten => s,n(busy),Playback(rellamada) ; en el caso que la extensión llamada esté ocupada anunciaremos que presionando la tecla 6 del teléfono podremos ser rellamados cuando la extensión se encuentre libre. Podemos hacer esto con Cepstral, Festival o creando un archivo audio que luego copiamos en la carpeta /var/lib/asterisk/sounds/es. En este ejemplo se está usando el archivo grabado

exten => s,n,Read(callbusy,,1,,1,5) ; la variable Read espera que el llamante presione una tecla

exten => s,n,GotoIf($["${callbusy}" = "6"]?callfile) ; si la tecla presionada es el 6 se seguirá procesando la llamada en la prioridad con etiqueta callfile. De lo contrario se seguirá enviando la llamada al contestador automático anunciando que la extensión se encuentra ocupada.

exten => s,n,VoiceMail(${MACRO_EXTEN}@default,b)

exten => s,n,Hangup()

exten => s,n(callfile),System(echo Channel:SIP/${MACRO_EXTEN} >> /tmp/callback${MACRO_EXTEN}) ; Aquí empieza la creación del call file. Asterisk llamará la extension ocupada

exten => s,n,System(echo Callerid:CallBack "<VozToVoice>" >> /tmp/callback${MACRO_EXTEN}) ; definimos el identificativo de la llamada

exten => s,n,System(echo WaitTime:30 >> /tmp/callback${MACRO_EXTEN}) ; Espera 30 segundos para que conteste

exten => s,n,System(echo Maxretries:10 >> /tmp/callback${MACRO_EXTEN}) ; número máximo de intentos (10)

exten => s,n,System(echo RetryTime:30 >> /tmp/callback${MACRO_EXTEN}) ; tiempo (en segundos) entre un intento y otro

exten => s,n,System(echo Account: ${ID}>> /tmp/callback${MACRO_EXTEN}) ; número de cuenta para el registro de las llamadas

exten => s,n,System(echo Application:Dial >> /tmp/callback${MACRO_EXTEN}) ; aplicación que se usará (dial)

exten => s,n,System(echo Data: SIP/${ID} >> /tmp/callback${MACRO_EXTEN}) ; número del llamante que asterisk conectará con la extensión ocupada una vez que esté libre.

exten => s,n,Wait(1) ; espera un segundo

exten => s,n,System(mv /tmp/callback${MACRO_EXTEN} /var/spool/asterisk/outgoing) ; mueve el archivo creado en la carpeta usada por asterisk para procesar los Call Files

exten => s,n,Hangup() ; cuelga la llamada

exten => h,1,Hangup ; cuelga la llamada si el llamante cuelga estando en cualquier línea de la macro

Diagrama de funcionamiento de rellamada



Cómo funciona el desvío de llamada.

1-      En este ejemplo vemos una llamada ya establecida entre el interno 2001 y el  interno 2002, cuando el interno 2003 intenta llamar al 2002 le da ocupado y un mensaje anuncia que se puede dejar la rellamada presionando la tecla 6. Una vez que finaliza la comunicación entre el interno 2001 y 2002, si se activo la rellamada suena el interno 2002 indicando que hay una rellamada del 2003,  si es acepada entonces suena el 2003 y se establece la  comunicación.

viernes, 30 de septiembre de 2011

Instalación codecs G729

En este documento detallaremos los pasos necesarios para instalar el codec G729. Este  codecs debe ser usado para pruebas o uso educacional (http://www.voip-info.org/wiki/view/Asterisk+G.729+Licensing).

Para realizar esto seguiremos los siguientes pasos:

Primero que todo ud. necesitamos saber qué tipo de CPU tenemos:

root@Ratchet:~# cat /proc/cpuinfo


processor       : 0vendor_id       : GenuineIntel

cpu family      : 6

model           : 26

model name      : Intel(R) Xeon(R) CPU    E5530  @ 2.40GHz

stepping        : 5

cpu MHz         : 2400.150

cache size      : 8192 KB

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 11

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss nx rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf pni ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm ida

bogomips        : 4800.30

clflush size    : 64

cache_alignment : 64

address sizes   : 40 bits physical, 48 bits virtual

power management:

luego nos fijamos que tipo de arquitectura es nuestro servidor.

root@Ratchet:~# uname -a

Linux Ratchet 2.6.32-5-686 #1 SMP Tue Mar 8 21:36:00 UTC 2011 i686 GNU/Linux

Pasamos a bajar el codec para nuestro servidor.

root@Ratchet:~# wget http://asterisk.hosting.lv/bin162/codec_g729-ast16-gcc4-glibc-pentium4.so



Pasamos a bajar el codec para nuestro servidor según nuestra arquitectura.

root@Ratchet:~# mv /usr/src/codec_g729-ast16-gcc4-glibc-pentium4.so /usr/src/codec_g729.so

root@Ratchet:~# chmod 777 codec_g72*.so

Copiamos el codecs al directorio de asterisk donde se encuentran los moulos.

root@Ratchet:~# cp codec_g72*.so /usr/lib/asterisk/modules



Reiniciamos el servidory entramos a la consola de asterisk.

root@Ratchet:~# reboot

root@Ratchet:~# rasterisk –vvv

Ratchet*CLI> core show translation //en versiones anteriores a la 1.6 el commando es “show translation”

Translation times between formats (in microseconds) for one second of data

Source Format (Rows) Destination Format (Columns)


Esta tabla indica los tiempos de conversión que emplea Asterisk para transcodificar el audio usando los diferentes códec.
Esto se indica a través de la tabla de doble entrada expresada  en (microsegundos).
Si en esta tabla observamos que no existen las filas y columnas para g729 esto significa que la central no tiene capacidad de conversión y por lo tanto el codec no está correctamente instalado.

TIPS: Si Asterisk se cuelga cuando reinicia, significa que instalamos la versión incorrecta del codec. Quitamos los codecs de /usr/lib/asterisk/modules y repetimos los procedimientos con diferentes y más apropiadas versiones de los codecs.

Fuente : http://forovoip.unvm.edu.ar

lunes, 26 de septiembre de 2011

Capturar llamadas (CallGroup/PickupGroup).

En el escenario que se describe a continuación,  vamos a configurar 4 internos de los cuales el interno 1002, 1003 y 1004 pueden tomar las llamadas de los mismos oprimiendo las teclas  *8 del teléfono IP, mientras que el interno 1001 no va a poder tomar dichas llamadas. Para esto deberemos colocar las líneas de pickupgroup y callgroup a los internos involucrados.

Archivo involucrado= /etc/asterisk/sip.conf

Para realizar esta tarea seguiremos los siguientes pasos:

editamos el archivo /etc/asterisk/sip.conf.

agregamos las líneas de pickupgroup y callgroup a los internos que queremos involucrar






 [1001]
type=friend
host=dynamic
context=phones
secret=9876
disallow=all
allow=ulaw
allow=alaw
mailbox=1001@default

[1002]
type=friend
host=dynamic
context=phones
secret=9876
disallow=all
allow=ulaw
allow=alaw
mailbox=1002@default
pickupgroup=1; grupos de los que puede tomar la llamada, en este caso del grupo 1
callgroup=1; grupo al que pertenece la extensión 1002

[1003]
type=friend
host=dynamic
context=phones
secret=9876
disallow=all
allow=ulaw
allow=alaw
mailbox=1003@default
pickupgroup=1
callgroup=1

[1004]
type=friend
host=dynamic
context=phones
secret=9876
disallow=all
allow=ulaw
allow=alaw
mailbox=1004@default
pickupgroup=1
callgroup=1

TIPS= Con CALLGROUP se define a que grupo pertenece la extensión, y con PICKUPGROUP de que grupos la extensión puede capturar las llamadas.



Cómo funciona la función CallGroup-PickupGroup .
 En el ejemplo vemos como una extensión externa llama a la oficina al interno 1001 donde el usuario no se encuentra. Gracias a las funciones de pickupgroup y callgroup; que se configuraron; vemos como el interno1003 puede tomar la llamada.

Desvío de Llamada

En este caso vamos a ver como se utiliza dicha función con tres internos. El desvío de llamada o call forwarding nos permite definir un desvío de llamada que se realiza a un interno a otro interno.

En el archivo/etc/asterisk/extensions.conf agregamos las siguientes líneas






 [phones]include => internal[internal]exten => _2XXX,1,Answer() ; contestamos la llamada

exten => _2XXX,n,Set(NUM=${DB(${EXTEN}/FORW)}) ; Leemos la base de datos para ver si hay algun valor en la familia 2XXX/FORW y lo asignamos al variable NUM

exten => _2XXX,n,GotoIf($["${NUM}" = ""]?normal:forw) ; si la variable NUM es vacía seguimos normalmente sino vamos a la etiqueta forw

exten => _2XXX,n(normal),Dial(SIP/${EXTEN},30,tTwmkKxX) ; llamamos a la extensión 2xxx

exten => _2XXX,n,Hangup() ; terminamos la llamada

exten => _2XXX,n(forw),DIAL(SIP/${NUM},60,tTwmgkKxX)  ; si el desvío es activo, marcamos el numero configurado para el desvío

exten => _2XXX,n,Dial(SIP/${EXTEN},10); sino existe desvío la llamada entra por esta línea

exten => _2XXX,n,VoiceMail(${EXTEN}@default,u)

exten => _2XXX,n,Playback(vm_goodbye)

exten => _2XXX,n,Hangup()

;;;;;con *98 entro a mi casilla de mensajes

exten => *98,1,Answer

exten => *98,2,Wait(1)

exten => *98,3,VoiceMailMain(${CALLERID}@default)

exten => *98,4,Hangup

;;;;;;;;con *71 desvío la llamada y con *72 cancelo

exten => *71,1,Goto(callfwd-add,s,1)

exten => *72,1,Goto(callfwd-remove,s,1)    

[callfwd-add] ; contexto para programar el desvió de llamada
exten => s,1,Answer() ; contestamos la llamada
exten => s,n,Set(NUM=${CALLERID(num)}) ; asignamos a la variable NUM el numero de la extensión que está llamando
exten => s,n,Set(COUNT=1) ; asignamos el valor 1 a la variable COUNT
exten => s,n(inicio),Playback(please-enter-the&telephone-number&for&your&call-forwarding&astcc-followed-by-the-pound-key) ; La voz de asterisk nos dirá que tenemos que digitar el numero al cual queremos desviar todas las llamadas
exten => s,n,Read(forw,,15,,2,10) ; Asterisk leerá los dígitos y los guardará en la variable forw
exten => s,n,Playback(call-forwarding) ; La voz de AsterisK dirá que el desvío de la llamada ha sido configurado para el numero
exten => s,n,Playback(has-been-set-to)
exten => s,n,SayDigits(${forw}) ; Saydigits lee uno a uno los digitos de la variable forw
exten => s,n,Playback(if-this-is-correct-press&digits/1&if-this-is-not-correct&digits/2) ; Si el numero que escuchamos es exacto presionamos 1 sino 2
exten => s,n,Read(sino,,1,,,5) ; asterisk lee nuestra respuesta y la guarda en la variable sino
exten => s,n,GotoIf($["${sino}" = "1"]?setf:conta) ; si sino es igual a uno vamos a la etiqueta setf sino a conta
exten => s,n(conta),Set(COUNT=$[${COUNT} + 1]) ; añadimos a la variable COUNT (que era 1) una unidad (el nuevo valor es 2)
exten => s,n,Gotoif($["${COUNT}" < "4"]?inicio:bye) ; si la variable COUNT es menor que 4 vamos a etiqueta inicio sino a la etiqueta bye. Esto sirve para permitir tres intentos de configuración antes de colgar la llamada.
exten => s,n(setf),Set(DB(${NUM}/FORW)=${forw}) ; etiqueta setf, guardamos en numero en la base de datos interna de Asterisk
exten => s,n,Wait(1) ; esperamos un segundo
exten => s,n(bye),Playback(goodbye) ; Escucharemos un saludo de despedida
exten => s,n,Hangup ; la llamada será terminada

[callfwd-remove]
exten => s,1,Answer
exten => s,n,Set(NUM=${CALLERID(num)})
exten => s,n,Wait(1)
exten => s,n,Set(forw=${DB_DELETE(${NUM}/FORW)})
exten => s,n,Playback(call-fwd-cancelled)
exten => s,n,Playback(goodbye)
exten => s,n,Hangup     

 
 
 
 
Cómo funciona el desvío de llamada.
 En este ejemplo mostramos como una llamada desde un interno cualquiera (2XXX) llama a la extensión 2002 donde el usuario realizo previamente  un desvío de llamada al interno 2003 digitando las siguientes teclas *71 2003#1 (con *71 activamos el desvío de llamada y con *72 lo desactivamos).  Como el interno 2002 no es atendido se deriva automáticamente a la extensión 2003 que es la oficina donde el usuario esta momentáneamente.

jueves, 7 de julio de 2011

Trunk- LACP entre SSR 8600 y switch A2

IMPORTANTE

!!!Antes de empezar a configurar los puertos asegurate que no tengan nada conectado. No deben tener link porque afecta a la configuración de Link Aggregation!!!!

En este ejemplo veremos como realizar un trunk de 4 ports entre el switch router SSR 8600 y el switch A2

===================

EN EL SSR 8600

===================

xp#config

xp(config)# smarttrunk create st.1 protocol no-protocol no-llap-ack
xp(config)#smarttrunk add ports et.2.(9-12) to st.1
xp(config)#vlan create TESORERIA port-based id 11
xp(config)#vlan add ports st.1 to TESORERIA
xp(config)#save active
xp(config)#save startup

===================

EN EL SWITCH A2

===================

A2(su)->set lacp static lag.0.1 fe.1.45-48

miércoles, 6 de julio de 2011

Creación de IVR en Asterisk

En este documento detallaremos los pasos necesarios para configurar un IVR para una central asterisk. El escenario se describe a continuación,  simularemos la entrada de una llamada exterior  marcando la extensión 2000, a continuación nos atenderá el IVR donde se escuchará la operadora de bienvenida diciendo el siguiente  mensaje

“Gracias por comunicarse con   Mi Empresa SRL….……para comunicarse con  Ventas marque 1… para  comunicarse con Soporte  marque 2 …. Para comunicarse con Administración  marque 3… para enviar un fax presione 4  sino aguarde y será atendido por una operadora.”

Para realizar esta tarea seguiremos los siguientes pasos:

crear un IVR en formato wav llamado menudia.wav y  convertirlo a extension gsm con el software WavePadSound editor.

con el winscp copiar el archivo creado (menudia2.gsm) en el siguiente PATH /var/lib/asterisk/sounds/es/

agregar  el contexto  menu-dia en el archivo extensions.conf. Si queremos listar el directorio, lo hacemos con la opción 9. Para ello copiar el archivo  cp /var/lib/asterisk/sounds/es/dir-intro.gsm /var/lib/asterisk/sounds/es/dir-welcome.gsm






[phones]include => internal

[internal]

exten => _2XXX,1,Dial(SIP/${EXTEN},10) ; llamados de ext 2xxx

exten => _2XXX,n,VoiceMail(${EXTEN}@default,u) ; opcion de dejar un mensaje en la casilla de la ext

exten => _2XXX,n,Playback(vm_goodbye) ; se despide con un mensaje

exten => _2XXX,n,Hangup() ; cuelga la comunicacion

;;;;;con *98 entro a mi casilla de mensajes

exten => *98,1,Answer

exten => *98,2,Wait(1)

exten => *98,3,VoiceMailMain(${CALLERID}@default)

exten => *98,4,Hangup

;llamando al interno 2000 entra al IVRsegun el horario ejecuta el mensaje

exten => 2000,1,GotoIfTime(9:00-18:00|mon-fri|*|*?menu-dia,s,1)

exten => 2000,2,GotoIfTime(18:01-8:59|mon-fri|*|*?menu-noche,s,1) 

[menu-noche]

exten=>s,1,Answer

exten=>s,2,Wait(1)

exten=>s,3,Playback(menunoct)

exten=>s,4,Hangup

;;;;; llamando al 3333 grabo un IVR

exten => 3333,1,Answer

exten => 3333,n,Wait(0.5)

exten => 3333,n,Record(menudia2.gsm)

exten => 3333,n,Wait(1)

exten => 3333,n,Playback(menudia2)

exten => 3333,n,Hangup()

 [menu-dia]

exten => s,1,Answer

exten => s,n,Wait(0.5)

exten => s,n,Background(menudia2) ; reproduce el mensaje grabado

exten => s,n,WaitExtend(5)

exten => 1,1,Goto(internal,2001,1) ; si selecciona la opcion 1 redirecciona a la ext 2001

exten => 2,1,Goto(internal,2002,1); si selecciona la opcion 2 redirecciona a la ext 2002

exten => 2,1,Goto(internal,2003,1); si selecciona la opcion 3 redirecciona a la ext 2003

exten => 9,1,Directory(default,user,e) ; si selecciona la opcion 9 redirige al directorio

exten => *,1,Goto(s,1) ; vuelve a reproducer el menu principal con la tecla asterisco

exten => t,1,Playback(goodbye) ; si esta mucho tiempo sin hacer nada despide y cuelga

exten => t,n,Hangup()

exten => i,1,Playback(pbx-invalid) ; si el numero digitado no es valido comunica el error

exten => i,n,goto(s,1) ;vuleve al menu principal del IVR

TIPS= La diferencia entre Playback() y Background () es que con Playback cuando reproduce un mensaje tengo que esperar a que termine para elegir la opción que deseo, en cambio con Background puedo oprimir la opción antes de que termine el mensaje.

Se agrega la siguiente línea al contexto features.






 [features]


exten => 2000,1,Goto(menu-dia,s,1) ; llamando a la ext 2000 ingresa al menu del IVR


se realiza la prueba llamando al interno 2000 donde tendría que escucharse el IVR

Diagrama de flujo de comportamiento del IVR

 



Cómo funciona el IVR según horarios.
Vamos hacer que el IVR según el horario la operadora de 2 tipos de mensajes

1-      Si el llamado es de lunes a viernes de 9:00 a 18:00 nos atiende la operadora dando la bienvenida y derivando a la extensión que queremos ejecutando el contexto menu-dia.

2-      Si el llamado es fuera de horario y día hábil, nos dará un mensaje informando el horario de atención, ejecutando el contexto menú-noche.

exten => 2000,1,GotoIfTime(9:00-18:00|mon-fri|*|*?menu-dia,s,1)

exten => 2000,2,GotoIfTime(18:01-8:59|mon-fri|*|*?menu-noche,s,1)

La sintaxis es la siguiente para entender cómo funciona el GotoifTime

(9:00-18:00|mon-fri|*|*?menu-dia,s,1)

(rango horario|dias de la semana|dias del mes| meses?contexto)

martes, 17 de mayo de 2011

Filtrar subject y mensajes con Postfix

Este tutorial nos muestra como poder bloquear subjects y  contenidos de mensajes que contengan algun texto que provenga como correo SPAM.
para esto realizamos lo siguiente:

Editamos el archivo main.cf

#vim /etc/postfix/main.cf

Agregamos estas lineas






body_checks = regexp:/etc/postfix/body_checks
header_checks = regexp:/etc/postfix/header_checks.regexp

Creamos el archivo para filtrar asuntos.

#vim /postfix/header_checks.regexp

Y colocamos la/s palabra/s que queremos filtrar






/^Subject:.*palabra_a_filtrar.*$/ REJECT "Asunto no valido"
/^Subject:.*Viagra.*$/ REJECT "Asunto no valido"

En la segunda linea estamos filtrando la palabra Viagra,lo que colocamos dentro de las comillas (Asunto no valido) es lo que va aparecer en el mail rejectado del remitente.

Creamos el archivo para filtrar contenido de mensaje.

#vim /etc/postfix/body_checks






/palabra_a_filtrar/ REJECT
/Viagra/ REJECT
/casino en linea/ REJECT

En la segunda linea estamos filtrando la palabra Viagra si apareciera en el cuerpo del mensaje.

Luego hacemos:

#postmap /etc/postfix/body_checks
#postmap /etc/postfix/header_checks.regexp

Se crearan los archivos con el mismo nombre con extension .db
Por ultimo reiniciamos postfix para que tome los cambios que realizamos

#/etc/init.d/postfix restart

miércoles, 11 de mayo de 2011

Como realizar un trunk IAX2 entre 2 Asterisk

Es Tutorial muestra como hacer un trunk IAX2 entre 2 Asterisk. La Sede A tiene los internos 2xxx y la Sede B los internos 10xx.

Para que la sede A pueda llamar a internos de la sebe B debemos realizar un trunk IAX2 y configurar los archivos iax.conf y extensions.conf en cada asterisk.



====================================
Sede A -170.x.x.x
====================================

En el archivo /etc/asterisk/iax.conf agregamos las siguientes lineas:

[general]
autokill=yes
register => SedeA:welcome@200.x.x.x

[2001]
type=friend
host=dynamic
context=phones

[SedeB]
type=friend
username=SedeA
host=dynamic
trunk=yes
secret=welcome
context=incoming_SedeA
permit=200.x.x.x/255.255.255.255

en el archivo que esta en /etc/asterisk/extensions.conf y colocamos lo siguiente:

[general]
autofallthrough=yes

[phones]
include => internal
include => remote

[internal]
exten => _2XXX,1,NoOp()
exten => _2XXX,n,Dial(IAX2/${EXTEN},30)
exten => _2XXX,n,Hangup()

[remote]
exten => _1XXX,1,NoOp()
exten => _1XXX,n,Dial(IAX2/SedeB/${EXTEN})
exten => _1XXX,n,Hangup()

[incoming_SedeA]
include => internal

========================
Sede B -200.x.x.x
========================

En el archivo /etc/asterisk/iax.conf agregamos las siguientes lineas:

[general]
autokill=yes
register => SedeB:welcome@170.x.x.x

[1001]
type=friend
host=dynamic
context=phones

[SedeA]
username=SedeB
type=friend
host=dynamic
trunk=yes
secret=welcome
context=incoming_SedeB
permit=170.x.x.x/255.255.255.255

en el archivo que esta en /etc/asterisk/extensions.conf y colocamos lo siguiente:

[general]
autofallthrough=yes

[phones]
include => internal
include => remote

[internal]
exten => _1XXX,1,NoOp()
exten => _1XXX,n,Dial(IAX2/${EXTEN},30)
exten => _1XXX,n,Hangup()

[remote]
exten => _2XXX,1,NoOp()
exten => _2XXX,n,Dial(IAX2/SedeA/${EXTEN})
exten => _2XXX,n,Hangup()

[incoming_SedeB]
include => internal

miércoles, 20 de abril de 2011

Trunk SIP entre 2 Asterisk

Es Tutorial muestra como hacer un trunk SIP entre 2 Asterisk. La Sede A tiene los internos 80xx y la Sede B los internos 10xx.

Para que la Sede A pueda llamar a internos de la sebe B debemos realizar un trunk SIP y configurar los archivos sip.conf y extensions.conf en cada asterisk

====================================
    ASTERISK SEDE A
====================================
editamos el archivo /etc/asterisk/sip.conf y agregamos las siguientes lineas

[general]
nat=yes
externip=ip_externa_ASTERISK_SEDE_A
localnet=10.10.0.0.0/255.255.0.0
externrefesh=180

register =>AsteriskSedeA:1234@ip_externa_ASTERISK_SEDE_B/AsteriskSedeB

[8001]
username=8001
type=friend
secret=2011
callerid="Juan" <8001>
host=dynamic
nat=yes
disallow=all
allow=ulaw
context=internal
mailbox=8001@voicemail
pickupgroup=1
callgroup=1

[AsteriskSedeB]
username=AsteriskSedeB
type=friend
secret=1234
context=internal
qualify=yes
host=dynamic
language=es
insecure=invite
disallow=all
allow=ulaw
allow=alaw

editamos el archivo /etc/asterisk/extensions.conf y agregamos las siguientes lineas

[internal]
exten => _80xx,1,Dial(SIP/${EXTEN},15,tT)
exten => _80xx,n,Hangup

exten => _10xx,1,Dial(SIP/${EXTEN}@AsteriskSedeB,10)
exten => _10xx,n,Hangup()

Luego en el asterisk de la sede A reiniciamos nuestro dialplan y el sip, y verificamos que se hayan registrado los asterisk

sedeA:#rasterisk
sedeA*CLI> sip reload

sedeA*CLI>dialplan reload

sedeA*CLI> sip show peers

Name/username                Host            Dyn Nat ACL Port     Status
AsteriskSedeB/AsteriskSedeB  10.10.200.26     D   N      5060     OK (1 ms)
8001/8001                    10.10.10.20      D   N      2857     Unmonitored
2 sip peers [Monitored: 1 online, 0 offline Unmonitored: 1 online, 0 offline]

sedeA*CLI>sip show registry

Host                            Username       Refresh State                Reg.Time
10.10.200.26:5060               AsteriskSedeA       105 Registered           Wed, 20 Apr 2011 14:40:08

===================================
                ASTERISK SEDE B
===================================
editamos el archivo /etc/asterisk/sip.conf y agregamos las siguientes lineas

[general]

nat=yes
externip=ip_externa_ASTERISK_SEDE_B
localnet=192.168.1.0/255.255.255.0

register =>AsteriskSedeB:1234@ip_externa_ASTERISK_SEDE_A/AsteriskSedeA

[1001]
username=1001
type=friend
secret=SedeB2011
callerid="carlos" <1001>
host=dynamic
nat=yes
disallow=all
allow=ulaw
context=internal
mailbox=1001@voicemail
pickupgroup=1
callgroup=1

[AsteriskSedeA]

username:AsteriskSedeA
type=friend
secret=1234
context=internal
qualify=yes
host=dynamic
language=es
insecure=invite
disallow=all
allow=ulaw
allow=alow

editamos el archivo /etc/asterisk/extensions.conf y agregamos las siguientes lineas

[internal]
exten => _10xx,1,Dial(SIP/${EXTEN},15,tT)
exten => _10xx,n,Hangup

exten => _80xx,1,Dial(SIP/${EXTEN}@AsteriskSedeA,10)
exten => _80xx,n,Hangup()

Luego en el asterisk de la sede B reiniciamos nuestro dialplan y el sip, y verificamos que se hayan registrado los asterisk
sedeB:#rasterisk
sedeB*CLI> sip reload

sedeB*CLI>dialplan reload

sedeB*CLI> sip show peers

Name/username                Host            Dyn Nat ACL Port     Status
AsteriskSedeA/AsteriskSedeA  10.10.200.31     D   N      5060     OK (1 ms)
1001/1001                    10.10.10.20      D   N      2857     Unmonitored
2 sip peers [Monitored: 1 online, 0 offline Unmonitored: 1 online, 0 offline]

sedeA*CLI>sip show registry

Host                            Username       Refresh State                Reg.Time
10.10.200.31:5060               AsteriskSedeB       105 Registered           Wed, 20 Apr 2011 14:41:53

Luego podemos realizar una llamada del interno 8001 al interno 1001 de la otra central y viceversa

miércoles, 13 de abril de 2011

Limitar cantidad de remitentes en Zimbra 6.0

Este ejemplo es para limitar la cantidad total de remitentes que uno puede añadir en un mail (Para, CC), en este ejemplo limitamos a 50 usuarios.

1.-Primero nos debemos loguear  comousuario zimbra en el servidor.

zimbra:#su - zimbra

Luego declaramos variales locales

zimbra:~$ zmlocalconfig -e default_extra_recipient_limit=50
zimbra:~$ zmlocalconfig -e default_recipient_limit=50
zimbra:~$ zmlocalconfig -e default_destination_recipient_limit=50
zimbra:~$ zmlocalconfig -e smtpd_recipient_limit=50
zimbra:~$ zmlocalconfig -e smtpd_recipient_overshoot_limit=50

2.- Segundo hacemos un backup y  añadimos las siguientes lineas en el archivo /opt/zimbra/conf/zmmta.cf  entre las lineas virtual_transport y RESTART mta

zimbra:~$cp /opt/zimbra/conf/zmmta.cf /opt/zimbra/conf/zmmta.cf.ori

zimbra:~$vim /opt/zimbra/conf/zmmta.cf






POSTCONF default_recipient_limit             LOCAL default_recipient_limitPOSTCONF default_destination_recipient_limit  LOCAL default_destination_recipient_limit

POSTCONF default_extra_recipient_limit       LOCAL default_extra_recipient_limit

POSTCONF smtpd_recipient_limit              LOCAL smtpd_recipient_limit

POSTCONF smtpd_recipient_overshoot_limit     LOCAL smtpd_recipient_overshoot_limit

3.- Reiniciamos el servicio

zimbra:~$zmmtactl stop

zimbra:~$zmmtactl start

jueves, 20 de enero de 2011

Parar maquina virtual desde linea de comando en Linux en VMWARE Server 2.0

Parar maquina virtual por comando

#vmrun -T server -h 'https://ip_del_Server:8333/sdk' -u root -p 'passwroot' stop "[standard] nombre_pc_virtual/archivo.vmx"

Arrancar maquina virtual por comando

#vmrun -T server -h 'https://ip_del_Server:8333/sdk' -u root -p 'passwroot' start "[standard] nombre_pc_virtual/archivo.vmx"

Reiniciar maquina virtual por comando

#vmrun -T server -h 'https://ip_del_Server:8333/sdk' -u root -p 'passwroot' reset "[standard] nombre_pc_virtual/archivo.vmx"

sábado, 8 de enero de 2011

Colocar las voces de asterisk en español

Dejo aca un tutorial, que lei no se donde de como hacerlo.

Lo que he hice para que salga en español los mensajes es lo siguiente:

desde raiz: / (lo siguiente se puede hacer un script que se ejecute y haga todo automatico)

#mkdir descarga
#cd descarga

Luego bajo los archivos con las voces en español
#wget www.voipnovatos.es/voces/voipnovatos-core-sounds-es-gsm-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-core-sounds-es-ulaw-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-core-sounds-es-alaw-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-core-sounds-es-g729-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-extra-sounds-es-gsm-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-extra-sounds-es-ulaw-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-extra-sounds-es-alaw-1.4.tar.gz
#wget www.voipnovatos.es/voces/voipnovatos-extra-sounds-es-g729-1.4.tar.gz
#wget www.voipnovatos.es/voces/licenciadeuso.txt
#cd /var/lib/asterisk/sounds/
#tar xvzf /descarga/voipnovatos-core-sounds-es-gsm-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-core-sounds-es-ulaw-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-core-sounds-es-alaw-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-core-sounds-es-g729-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-extra-sounds-es-gsm-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-extra-sounds-es-ulaw-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-extra-sounds-es-alaw-1.4.tar.gz
#tar xvzf /descarga/voipnovatos-extra-sounds-es-g729-1.4.tar.gz
#chown -R asterisk:asterisk /var/lib/asterisk/sounds/

modifique los siguientes archivos de asterisk ubicados dentro de /etc/asterisk:

iax_custom.conf
sip_custom.conf
chan_dahdi.conf
sip_general_custom.conf
iax_general_custom.conf
sip_general_additional.conf
sip.conf

Agragandoles la sigueinte linea:

language=es

Y copie los archivos en otro sitio para que tambien me diga los numeros de los internos en español

#cp /var/lib/asterisk/sounds/letters/es /var/lib/asterisk/sounds/es/letters -R
#cp /var/lib/asterisk/sounds/phonetic/es /var/lib/asterisk/sounds/es/phonetic -R
#cp /var/lib/asterisk/sounds/dictate/es /var/lib/asterisk/sounds/es/dictate -R
#cp /var/lib/asterisk/sounds/digits/es /var/lib/asterisk/sounds/es/digits -R