OpenMeetings 2.0 debian Squeeze + asterisk. Parte 1

Hoy toca la integración de OpenMeetings con Asterisk…. un gran paso. Primero instalaremos OpenMeetings 2.0 en nuestro debian y luego, lo integraremos con Asterisk.

Álvaro (aka Greenes), colaborador habitual del proyecto (http://incubator.apache.org/openmeetings/) es el responsable del manual original, del que yo, símplemente he “copiado” aquí, en mi blog.

Partimos de la base de nuestro debian recién instalado, nos vamos al fichero /etc/apt/sources.list y añadimos al principio:

deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free
deb http://ftp.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.debian.org/debian/ squeeze main contrib non-free
deb http://ftp.debian.org/debian/ squeeze-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ squeeze-updates main contrib non-free
deb http://ftp2.de.debian.org/debian squeeze main non-free
deb http://deb-multimedia.org squeeze main

Hacemos un update:

#apt-get update

Y pasado un rato, estaremos en disposición de empezar a instalar dependencias, siendo :

apt-get install sun-java6-jdk
apt-get install openoffice.org-writer openoffice.org-calc openoffice.org-impress
openoffice.org-draw openoffice.org-math imagemagick gs-gpl -y
apt-get install libgif-dev xpdf libfreetype6 libfreetype6-dev libjpeg8 libjpeg62 libjpeg8-dev
apt-get install g++ libjpeg-dev libdirectfb-dev libart-2.0-2 libt1-5 zip unzip bzip2
apt-get install subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev
apt-get install libmp3lame-dev libsdl1.2-dev libx11-dev libxfixes-dev libxvidcore4-dev zlib1g-dev
apt-get install libogg-dev sox libvorbis0a libvorbis-dev libgsm1 libgsm1-dev libfaad2 flvtool2 lame

al hacer el apt-get install sun-java6-jdk, tenemos que aceptar la licencia….. Googleando un poco en la página del proyecto, en versiones anteriores a la 2.0, funcionaba con la openJDK, pero ahora no, en fin.

Instalararemos el mysql-server + mysql-client y crearemos una BBDD para openmeetings, o usaremos otro MySQL que tengamos instalado en otro server. Entramos en el MySql en cuestión y creamos la BBDD y un usuario para tal caso, siendo openmeetings / openmeetings.

CREATE DATABASE openmeetings DEFAULT CHARACTER SET ‘utf8’;
GRANT ALL PRIVILEGES ON openmeetings.* TO ‘openmeetings’@’localhost’ IDENTIFIED BY ‘openmeetings’ WITH GRANT OPTION;

Ahora descargamos y compilamos el SWF:

wget http://www.swftools.org/swftools-2012-04-08-0857.tar.gz
tar -zxvf swftools-2012-04-08-0857.tar.gz
cd swftools-2012-04-08-0857
./configure
make
make install

Ahora toca el paquete ffmpeg:

wget http://ffmpeg.org/releases/ffmpeg-0.11.1.tar.gz
tar -zxvf ffmpeg-0.11.1.tar.gz
cd ffmpeg-0.11.1
./configure –enable-libmp3lame –enable-libxvid –enable-libvorbis –enable-libgsm –enable-libfaac –enable-gpl –enable-nonfree
make
checkinstall

Ahora seguimos con el JOD converter:

wget http://jodconverter.googlecode.com/files/jodconverter-core-3.0-beta-4-dist.zip
unzip jodconverter-core-3.0-beta-4-dist.zip

Y seguimos con ANT, pero usaremos la versión 1.8.4 para compilar openMeetings

wget http://mirror.catn.com/pub/apache//ant/binaries/apache-ant-1.8.4-bin.tar.gz
tar -zxvf apache-ant-1.8.4-bin.tar.gz

Y ahora descargamos openmeetings:

# svn checkout http://svn.apache.org/repos/asf/incubator/openmeetings/branches/2.0/

Y lo compilamos:

# cd /usr/adm/2.0
# /usr/adm/apache-ant-1.8.4/bin/ant clean.all
# /usr/adm/apache-ant-1.8.4/bin/ant -Ddb=mysql

Una vez compilado (tardará un buen rato), lo movemos a su ubicación correcta:

# cd /usr/adm/2.0/dist
# mv red5/ /usr/lib/

Movemos de sitio el JOD converter, a la carpeta de OM

cp -R /usr/adm/jodconverter-core-3.0-beta-4 /usr/lib/red5/webapps/openmeetings

Y cambiamos unos permisos:

# chown -R nobody /usr/lib/red5
# chmod +x /usr/lib/red5/red5.sh
# chmod +x /usr/lib/red5/red5-debug.sh

Y creamos el script para controlar red5:

# nano /etc/init.d/red5

Y hacemos copy & paste de lo siguiente…. (Gracias a Álvaro por modificar el script)

#! /bin/sh
### BEGIN INIT INFO
# Provides: red5
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts red5 server for Openmeetings.
# OpenMeetings 2.X Installation on Debian 64bit Squeeze
# Stephen Cottham 29/07/2012
### END INIT INFO
# For RedHat and cousins:
# chkconfig: 2345 85 85
# description: Red5 flash streaming server for OpenMeetings
# processname: red5
# Created By: Sohail Riaz (sohaileo@gmail.com)
# Modified by Alvaro Bustos
PROG=red5
RED5_HOME=/usr/lib/red5
DAEMON=$RED5_HOME/$PROG.sh
PIDFILE=/var/run/$PROG.pid
[ -r /etc/sysconfig/red5 ] && . /etc/sysconfig/red5
RETVAL=0
case “$1” in
start)
cd $RED5_HOME
start-stop-daemon –start -c nobody –pidfile $PIDFILE
–chdir $RED5_HOME –background –make-pidfile
–exec $DAEMON >/dev/null 2>/dev/null &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
echo $! > $PIDFILE
fi
echo
;;
stop)
start-stop-daemon –stop –quiet –pidfile $PIDFILE
–name java
rm -f $PIDFILE
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$PROG
;;
restart|force-reload)
$0 stop
$0 start
;;
status)
# Debian and Ubuntu 10 status check
ps aux | grep -f $PIDFILE >/dev/null 2>/dev/null && RETVAL=0 || RETVAL=3
# Ubuntu 12 status check using improved “start-stop-daemon” status query
# (use the above command, or comment out above command and uncomment the two below commands.
# start-stop-daemon –status –pidfile $PIDFILE
# RETVAL=$?
[ $RETVAL -eq 0 ] && echo “$PROG is running”
[ $RETVAL -eq 1 ] && echo “$PROG is not running and the pid file exists”
[ $RETVAL -eq 3 ] && echo “$PROG is not running”
[ $RETVAL -eq 4 ] && echo “$PROG – unable to determine status”
;;
checkports)
netstat -anp | grep soffice
netstat -anp | grep java
;;
*)
echo $”Usage: $0 {start|stop|restart|force-reload|status|checkports}”
RETVAL=1
esac
exit $RETVAL

Seteamos permisos para que pueda ejecutarse:

chmod +x /etc/init.d/red5
update-rc.d red5 defaults

Hacemos backup del fichero persistence.xml, por si las moscas:

mv /usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml
/usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml-ori

Y ahora renombramos para habilitar el template de mysql:

# mv /usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/mysql_persistence.xml
/usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml

#mv /usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/mysql_persistence.xml
/usr/lib/red5/webapps/openmeetings/WEB-INF/classes/META-INF/persistence.xml

Ahora editamos el fichero y cambiamos los datos de acceso mysql

, TestOnBorrow=true
, poolPreparedStatements=true
, Username=openmeetings
, Password=openmeetings”/>

Y iniciamos red5

# /etc/init.d/red5 start

Y si todo ha ido bien, empezaremos a configurarlo, accediendo a la web:

http://ip.del.web.server:5080/openmeetings/install

Rellenamos el user / pass:

Username: admin
Userpass: password
EMail: admin@dominio.com
User Time Zone: spain
Organisation(Domains) craem.net

Y al final de la hoja, le damos al botón de install. Esperamos un poco y ya tenemos la primera parte lista.

Instalando BigBlueButton en Debian Squeeze

Tenía pendiente instalar el bigBlueButton sobre Debian…. aquí está la guia.

Primero, hemos de añadir los repositorios de ubuntu:

# wget http://ubuntu.bigbluebutton.org/bigbluebutton.asc -O- | apt-key add –
# wget http://archive.bigbluebutton.org/bigbluebutton.asc
# sudo apt-key add bigbluebutton.asc
# echo “deb http://ubuntu.bigbluebutton.org/lucid/ bigbluebutton-lucid main”
| sudo tee /etc/apt/sources.list.d/bigbluebutton.list
# echo “deb http://us.archive.ubuntu.com/ubuntu/ lucid multiverse”
| sudo tee -a /etc/apt/sources.list
# apt-get update

Añadimos la gestión de usuarios:

aptitude install sudo

Y más cosillas

#aptitude install libgmp3c2
# cd /usr/src
# wget http://ubuntu.mirror.cambrium.nl/ubuntu//pool/main/m/mpfr/libmpfr1ldbl_2.4.2-3ubuntu1_amd64.deb
# dpkg -i libmpfr1ldbl_2.4.2-3ubuntu1_amd64.deb

y preparamos para nginx:

mkdir -p /var/www/nginx-default/
touch /var/www/nginx-default/50x.html

Ahora instalamos BigBlueButton con asterisk:

aptitude install bbb-voice-conference bbb-client bigbluebutton

Esperamos un rato y acabamos…

bbb-conf –clean
bbb-conf –check
bbb-conf –setip tu.ip.bbb.es

Enjoy your BBB

Recuperar un SPA400 como gateway en asterisk

Hace poco he recuperado un cacharro que tenía tirado por la oficina… el linksys spa400. En su día lo compramos como gateway para los enlaces GSM del asterisk de la office, pero sus cuelgues y estabilidad, lo relegaron a estar apagado y sustituirlo por un portech mv-374.

Pese a ello, tiene 4 puertos FXO, que nos valdrán para enchufarlo a alguna línea y hacer pruebas…. la config:

en el extensions.conf, sección [globals]

[globals]
OUT_2 = SIP/spa400

Luego, donde vayan las entrantes

exten => spa400,1,NoOP(llamada entrante desde spa400)
exten => spa400,n,Dial(SIP/3005&SIP/3006,100,tTm)
exten => spa400,n,Voicemail(3000)
exten => spa400,n,Hangup

Y para las salientes…..

exten => _[89][123456789]XXXXXXX,n,Dial(SIP/${EXTEN}@spa400,100,tT)

Y ahora, en el sip.conf, en el register

register => spa400@ip.del.spa.400/spa400

y la definición:

[spa400]
type =friend
user =spa400
secret =
host =ip.del.spa.400
dtmfmode=rfc2833
context =contexto_de_entrantes
insecure=very

Y ahora, en la web del spa400:

Y más cosillas:

Seguimos…

Y por último…

Enjoy your spa400 🙂

NATear rango de puertos en un router cisco

Como ya sabréis, para hacer NAT por puertos en un router cisco, hay que añadir una línea por cada uno de ellos, del tipo:

ip nat inside source static tcp 192.168.2.3 8080 X.X.X.X 8080 route-map nonat extendable

Aquí estamos NATeando el puerto 8080 a la máquina 192.168.2.3 de nuestra red, donde X.X.X.X es la ip pública nuestra.

Pero el problema es, si queremos NATear un rango entero de puertos…. por ejemplo…. publicamos nuestro servidor de VoIP y necesitamos del 10000 al 20000 UDP para el media y el 5060 UDP para el signaling.

La pesadilla puede ser tremenda…. aunque no es necesario para la voIP los 10000 puertos, pero hacer un rango de 10 o 20, es poco elegante, más si nuestro router ya tiene más nats hechos, con lo que la config se puede volver muuuuy larga.

hace unos días, leyendo documentación de cisco por otros temas, veo el NAT ROTARY, siendo la definición de cisco:

Destination Address Rotary Translation
A dynamic form of destination translation can be configured for some outside-to-inside traffic. Once a mapping is set up, a destination address matching one of those on an access list will be replaced with an address from a rotary pool. Allocation is done in a round-robin basis, performed only when a new connection is opened from the outside to the inside. All non-TCP traffic is passed untranslated (unless other translations are in effect).

Y vemos la palabra mágica:

Destination address matching one of those on an access list

Vamos a investigar un poco:

Primero, hacemos el access-list para los puertos de nuestro VoIP server:

ip access-list extended voip
permit udp any any eq 5060
permit udp any any range 10000 20000

Y ahora el nat con el access-list, contra la ip 192.168.2.5, que será nuestro VoIP Server:

ip nat pool ASTERISK 192.168.2.5 192.168.2.5 netmask 255.255.255.0 type rotary

Finalmente, la destinación del NAT con la ACL:

ip nat inside destination list voip pool ASTERISK

Y ahora, enjoy the nat!!!, hasta que llegue el IPv6.

How to Cisco IPSEC VPN Galaxy GT-i9003

Una de las pocas cosas cosas que no me ha gustado de android desde siempre, es el NEFASTO soporte para VPN…. dispositivos similares como el iphone / ipad, lo traen de serie y funciona a las mil maravillas.

Vale que trae soporte para VPN L2TP / IPSEC, pero me ha sido prácticamente imposible hacerlo funcionar con la red de mi casa y mucho menos, ponerlo en práctica con los clientes.

En mi caso, tengo el Samsung Galaxy GT-i9003, con la versión 2.3.4 y en casa un cisco 1841 advanced IP services y varios túneles GRE over IPSEC.

Necesito la vpn, ya que JOIGO y VOMISTAR, que yo sepa los demás no, capan la VoIP y esto había que solucionarlo.

Tengo un asterisk publicado para estos menesteres y desde que cambié de Orange a Joigo, todo han sido problemas….. nada de SIP / IAX y incluso, cambiando de puerto… total, que ya me había “casi” resignado a no usar la voIP desde mi móvil (y varios colegas riéndose cada día por ello)

No es sencillo, pero aquí os detallo los pasos… contando que hemos de actualizar nuestro samsung Galaxy a la 2.3.5 de android. Todo con software original.

1º) Instalamos el KIES en nuestro pc windows (un problemón para mí, pero se hace el esfuerzo)
2º) Descargamos el siguiente firmware I9003XXKPE.rar, password samfirmware.com.
3º) Una vez descargado, extraemos los ficheros en una carpeta y ejecutamos el ODIN.
4º) Apagamos el móvil, le quitamos la tarjeta SD y la SIM y lo ponemos en modo DOWNLOADING, pulsando a la vez, HOME + VOL – Y POWER. Deberemos de tener la pantalla así:

5º) Conectamos el cable usb con el KIES cerrado y el ODIN abierto, seleccionamos la casilla “repartition”, “auto reboot” y “F. Reset Time”.
6º) En el apartado PIT seleccionamos el archivo Latona, que se encuentra en la carpeta que hemos extraido antes y le damos al “START”

Dejamos que acabe el proceso y el teléfono se reseteará.

Ahora toca volverlo a flashear con la versión 2.3.3. Apagamos el teléfono, lo dejamos otra vez en modo “DOWNLOADING”, reseteamos el ODIN y seleccionamos ahora los archivos que hemos extraido:

BOOTLOADER: “APBOOT_I9003XXKPE_CL409735_REV08_user_low_ship.tar .md5”
PDA : “CODE_I9003XXKPE_CL409735_REV08_user_low_ship.tar.md5”
PHONE : “MODEM_I9003XXKPE_REV_00_CL1041909.tar.md5”
CSC : “GT-I9003-CSC-MULTI-OXAKPE.tar.md5”

Le damos a START y esperar que acabe el proceso…..

Ahora toca subirlo a la versión KMP, que es la 2.3.5. Descargamos el siguiente fichero de aquí y password sampro.pl

1º) reseteamos el ODIN
2º) En el apartado PDA, seleccionamos el fichero que nos acabamos de descargar y le damos al [START]
3º) Esperamos que acabe el proceso y el teléfono se reiniciará.

Una vez acabado, tendremos que rootearlo, para ello nos bajamos este fichero

Ponemos el móvil en modo downloading otra vez, lo conectamos al pc con el ODIN abierto.

a) Click en [PDA] y seleccionamos el archivo que nos acabamos de descargar.
b) Una vez el archivo esté colocado en el apartado PDA, le daremos a START.

Dejamos que acabe el proceso y se reiniciará.

ahora toca “deodexarlo”, para ello, bajamos este archivo.

Lo copiamos en la sd y nos vamos al icono de CWM y escojemos la opción de Reboot into ClockWorkMod Recovery

1º) Una vez iniciado en CWM, seleccionamos “Install ZIP from SD card”
2º) Ahora le damos a “Choose zip”
3º) Seleccionamos el fichero que hemos copiado en la SD
4º) Aceptamos la instalación y se reiniciará el teléfono.

Una vez tenemos el terminal rooteado y deodexado, bajamos del market el VPNC WIDGET

Añadimos este widget en el escritorio, como widget (vaya redundáncia…..) y la configuramos, rellenando todos los parámetros:

Ahora, copiamos el tun.ko en la raiz de la memoria interna (sd interna). Instalamos el programa, desde el market, Terminal Emulator

Tecleamos :

$ su

Aceptamos los permisos de superusuario que nos pide el programa y instalamos el módulo:

$ cd ..
$ insmod tun.ko
$

ahora salimos del terminal y nos vamos al WIDGET VPNC que tenemos en el escritorio, le damos al icono y VOILÀ !!!!!!! YA ESTAMOS CONECTADOS A LA VPN.

Y a partir de aquí, a disfrutar de la VoIP, RDP, SSH y todos los servicios que tengamos en nustra red local.

Llamadas salientes portech mv-378 con asterisk

El siguiente código muestra como aprovechar para las llamadas salientes los 8 canales de nuestro portech mv-378; el código original aquí:

en el extensions.conf, definimos:

[globals]

TRY1=SIP/GSMtrunk
TRY2=SIP/GSMtrunk1
TRY3=SIP/GSMtrunk2
TRY4=SIP/GSMtrunk3
TRY5=SIP/GSMtrunk4
TRY6=SIP/GSMtrunk5
TRY7=SIP/GSMtrunk6
TRY8=SIP/GSMtrunk7

;////////////////////////////////////////////
; ////// moviles ///////////////////////////
;////////////////////////////////////////////

[macro-encuentra-linea]
exten => s,1,set(TRIES=0) ; inicializamos la variable
exten => s,n(nextone),set(TRIES=$[${TRIES} + 1]) ; incrementa 1 a TRIES
exten => s,n,set(DIALSTRING=${TRY${TRIES}}) ; asignamos el valor de TRYn al DIALSTRING
exten => s,n,gotoif($[“${DIALSTRING}” = “”]?donehere) ; vemos si la variable = “” entonces no hay canales
exten => s,n,ChanIsAvail(${DIALSTRING}) ; para ver si el canal esta activo
exten => s,n,gotoif($[${AVAILSTATUS} = 0]?:nextone)
exten => s,n,gotoif($[${GROUP_COUNT(${DIALSTRING})} >= 1]?nextone) ; el canal esta ocupado
exten => s,n,set(GROUP()=${DIALSTRING}) ; Encontramos linea !!!!
exten => s,n,Dial(${DIALSTRING}/${ARG1}) ; Marcamos
exten => s,n,GotoIf($[“${DIALSTATUS}” = “BUSY”]?donehere) ; no podemos llamar 🙁
exten => s,n,NoOp(“Vamos al siguiente canal”);
exten => s,n,goto(nextone) ; TEMP
exten => s,n(donehere),MacroExit() ; finalizamos, no hay canales

[moviles]
exten => _6XXXXXXXX,1,Macro(encuentra-linea,${EXTEN})
exten => _6XXXXXXXX,n,hangup()