May 26, 2018

Freeswitch 1.9 (master) en debian 8 (y debian 9) con soporte postgresql

Venga, éste post espero que si sea el definitivo, voy a probar que tal con debian 9 mas tarde y si conviene hago otro post.

ACTUALIZACIÓN
Éste manual también es válido para debian 9! :) mirad al final del artículo las anotaciones

Empezamos con una debian 8 recién instalada.

Vamos a instalar primero de todo todas las dependencias necesarias

root@freeswitch-capa8:~# apt-get install git libpq-dev postgresql postgresql-client build-essential dialog autoconf libtool-bin yasm
root@freeswitch-capa8:~# apt-get install zlib1g-dev libjpeg-dev pkg-config libsqlite3-dev libcurl4-gnutls-dev libpcre3-dev libogg-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libtiff5-dev libopus-dev libsndfile-dev liblua5.2-dev

Las primeras dependencias son las que necesitamos para preparar la instalación de freeswitch, las segundas las librerías que pide al momento de hacer el “./configure –enable-core-pgsql-support”.

Primero de todo crearemos una base de datos en el postgresql sobre la que queremos que freeswitch trabaje.

root@freeswitch19-capa8:~# su - postgres
postgres@freeswitch19-capa8:~$ createuser freeswitch_user
postgres@freeswitch19-capa8:~$ createdb -O freeswitch_user freeswitch_db
postgres@freeswitch19-capa8:~$ psql freeswitch_db
freeswitch_db=# ALTER USER freeswitch_user WITH PASSWORD 'XXX';
freeswitch_db=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO freeswitch_user;
freeswitch_db=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO freeswitch_user;

Ahora descargamos freeswitch del repositorio git en /usr/src/

root@freeswitch19-capa8:/usr/src# git clone https://freeswitch.org/stash/scm/fs/freeswitch.git
Cloning into 'freeswitch'...
remote: Counting objects: 307888, done.
remote: Compressing objects: 100% (67730/67730), done.
remote: Total 307888 (delta 239698), reused 298098 (delta 232095)
Receiving objects: 100% (307888/307888), 148.13 MiB | 9.94 MiB/s, done.
Resolving deltas: 100% (239698/239698), done.
Checking connectivity... done.

Ahora iremos al directorio /usr/src/freeswitch/scripts y ejecutaremos el script FreeSWITCH-debian-raspbian-installer.sh

root@freeswitch19-capa8:/usr/src# cd /usr/src/freeswitch/scripts/
root@freeswitch19-capa8:/usr/src/freeswitch/scripts# ./FreeSWITCH-debian-raspbian-installer.sh

Éste script nos hará algunas preguntas a las que tendremos que responder.

La primera es si queremos instalar freeswitch 1.6 o freeswitch 1.7, que en realidad es freeswitch 1.9 porque se descarga de nuevo el código de la rama master de freeswitch en el directorio /usr/src/freeswitch.git/.

Ahora le indicaremos el FQDN, la IP y el mail del robot que mandará e-mails de notificaciones.

Ahora empezará a trabajar él solo un buen rato.

Al final tiene que salirte algo similar a ésto

Done, without errors.


Execution Time (2018-05-26 01:20:40 UTC+2)
loading tasks     300ms  ▇▇▇ 2%
wiredep:app       174ms  ▇▇ 1%
concurrent:dist    3.4s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 23%
cssmin:generated  996ms  ▇▇▇▇▇▇▇▇ 7%
ngAnnotate:dist    1.6s  ▇▇▇▇▇▇▇▇▇▇▇▇ 10%
uglify:generated   7.6s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 51%
Total 15s

Éste script ha instalado todas las dependencias necesarias para hacer funcionar todos los módulos y compilar así freeswitch. El script también instala freeswitch, pero la instalación resultante no tiene el conector con postgresql compilado y tendremos que especificarselo expresamente, luego make y finalmente make install.

root@freeswitch19-capa8:/usr/src/freeswitch/scripts# cd /usr/src/freeswitch.git/
root@freeswitch19-capa8:/usr/src/freeswitch.git# ./configure --enable-core-pgsql-support
root@freeswitch19-capa8:/usr/src/freeswitch.git# make
root@freeswitch19-capa8:/usr/src/freeswitch.git# make install

Si en el proceso dice que le falta alguna dependencia (sobretodo al hacer el make), se resuelve y se vuelve a iniciar todo el proceso desde el “./configure –enable-core-pgsql-support”.

Si todo va bien seguimos! ahora tenemos la última versión de la rama master de freeswitch instalada y con soporte de postgresql.

Copiamos el fichero /freeswitch.sh en /etc/init.d/

root@freeswitch19-capa8:/usr/src/freeswitch.git# cp scripts/freeswitch.sh /etc/init.d/

Una vez instalado, tendremos que indicarle los datos de acceso a la base de datos a freeswitch. Para ello nos posicionaremos en el directorio /usr/local/freeswitch/conf/ y editaremos los siguientes ficheros:

Grupo 1

root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/switch.conf.xml

Grupo 2

root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/directory.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/voicemail.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/cidlookup.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/db.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/lcr.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/callcenter.conf.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi jingle_profiles/server.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi sip_profiles/internal.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi sip_profiles/internal-ipv6.xml
root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi skinny_profiles/internal.xml

Grupo 3

root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi autoload_configs/easyroute.conf.xml

En cada uno de ellos deberemos buscar alguna referencia a la configuración de la db (buscas odbc-dsn y en la línea siguiente pegas el código que ahora mostraré). Cada grupo de los que he indicado arriba, el formato de la línea de configuración cambia un poco, así que por cada grupo de ficheros indicaré la línea que se tiene que añadir. Al grupo 3 se tienen que añadir/modificar varias líneas.
Revisad que no haya dos líneas haciendo referencia a la misma configuración, usad para comentar (mejor que borrar) la línea ante las dudas.

- Grupo 1: 
*param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch_db user=freeswitch_user password='XXX' options='-c client_min_messages=NOTICE'" />

- Grupo 2: 
*param name="odbc-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch_db user=freeswitch_user password='XXX' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />

- Grupo 3:
*param name="db-username" value="freeswitch_user"/>
*param name="db-password" value="XXX"/>
*param name="db-dsn" value="freeswitch"/>
*param name="db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch_db user=freeswitch_user password='XXX' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />
/!\ borrar el * /!\

Ahora lo siguiente serà comprobar que freeswitch está parado y que no hay tablas en la base de datos que hemos creado de postgresql. Para verificar que el usuario que hemos configurado a freeswitch en lugar del usuario “root” de postgresql, el usuario postgres, vamos a usar el que hemos creado al principio del artículo al crear la base de datos.

root@freeswitch19-capa8:~# ps aux |grep freeswitch
root@freeswitch19-capa8:~# su - postgres
postgres@freeswitch19-capa8:~$ psql -U freeswitch_user -d freeswitch_db --password
Password for user freeswitch_user: 
psql (9.4.15)
Type "help" for help.

freeswitch_db=> \dt
No relations found.

Si no podemos conectar con éste usuario, deberemos revisar la configuración del fichero pg_hba.conf (comentamos las líneas con # y añadimos la última debajo de la primera línia que comento) y reiniciamos postgresql.

root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi /etc/postgresql/9.4/main/pg_hba.conf
#local   all             postgres                                peer
#local   all             all                                     peer
local    all             all                                     trust
root@freeswitch19-capa8:/usr/local/freeswitch/conf# /etc/init.d/postgresql restart
[ ok ] Restarting postgresql (via systemctl): postgresql.service.
root@freeswitch19-capa8:/usr/local/freeswitch/conf# su - postgres
postgres@freeswitch19-capa8:~$ psql -U freeswitch_user -d freeswitch_db --password
Password for user freeswitch_user: 
psql (9.4.15)
Type "help" for help.

freeswitch_db=> \dt
No relations found.

Ahora vamos a arrancar freeswitch y para comprobar que la conexión es correcta, mostraremos de nuevo las tablas de la base de datos y veremos que habrá creado todas las tablas!

root@freeswitch19-capa8:~# /etc/init.d/freeswitch.sh start
22613 Backgrounding.
freeswitch_db=> \dt

                           List of relations
 Schema |                Name                 | Type  |      Owner      
--------+-------------------------------------+-------+-----------------
 public | aliases                             | table | freeswitch_user
 public | calls                               | table | freeswitch_user
 public | channels                            | table | freeswitch_user
 public | complete                            | table | freeswitch_user
 public | db_data                             | table | freeswitch_user
 public | group_data                          | table | freeswitch_user
 public | interfaces                          | table | freeswitch_user
 public | limit_data                          | table | freeswitch_user
 public | nat                                 | table | freeswitch_user
 public | recovery                            | table | freeswitch_user
 public | registrations                       | table | freeswitch_user
 public | sip_authentication                  | table | freeswitch_user
 public | sip_dialogs                         | table | freeswitch_user
 public | sip_presence                        | table | freeswitch_user
 public | sip_registrations                   | table | freeswitch_user
 public | sip_shared_appearance_dialogs       | table | freeswitch_user
 public | sip_shared_appearance_subscriptions | table | freeswitch_user
 public | sip_subscriptions                   | table | freeswitch_user
 public | tasks                               | table | freeswitch_user
 public | voicemail_msgs                      | table | freeswitch_user
 public | voicemail_prefs                     | table | freeswitch_user
(21 rows)

(END)

Y si queremos ver los logs vamos a /usr/local/freeswitch/log/freeswitch.log

root@freeswitch19-capa8:~# less /usr/local/freeswitch/log/freeswitch.log 

Si en cualquier momento tenemos algun problema, podemos subir el nivel de debug del fichero de log en el fichero vars.xml del directorio de configuración de freeswitch.

root@freeswitch19-capa8:/usr/local/freeswitch/conf# vi vars.xml
*X-PRE-PROCESS cmd="set" data="console_loglevel=debug"/>
/!\ borrar el * /!\

cambiamos el info por debug. Paramos freeswitch y lo volvemos a arrancar

root@freeswitch19-capa8:/usr/local/freeswitch/conf# /etc/init.d/freeswitch.sh stop
Killing: 22613
root@freeswitch19-capa8:/usr/local/freeswitch/conf# /etc/init.d/freeswitch.sh start
22719 Backgrounding.

Finalmente nos tendrá que haber creado las siguientes tablas

freeswitch_db=# \dt

                           List of relations
 Schema |                Name                 | Type  |      Owner      
--------+-------------------------------------+-------+-----------------
 public | aliases                             | table | freeswitch_user
 public | calls                               | table | freeswitch_user
 public | channels                            | table | freeswitch_user
 public | complete                            | table | freeswitch_user
 public | db_data                             | table | freeswitch_user
 public | group_data                          | table | freeswitch_user
 public | interfaces                          | table | freeswitch_user
 public | limit_data                          | table | freeswitch_user
 public | nat                                 | table | freeswitch_user
 public | recovery                            | table | freeswitch_user
 public | registrations                       | table | freeswitch_user
 public | sip_authentication                  | table | freeswitch_user
 public | sip_dialogs                         | table | freeswitch_user
 public | sip_presence                        | table | freeswitch_user
 public | sip_registrations                   | table | freeswitch_user
 public | sip_shared_appearance_dialogs       | table | freeswitch_user
 public | sip_shared_appearance_subscriptions | table | freeswitch_user
 public | sip_subscriptions                   | table | freeswitch_user
 public | tasks                               | table | freeswitch_user
 public | voicemail_msgs                      | table | freeswitch_user
 public | voicemail_prefs                     | table | freeswitch_user
(21 rows)

(END)

Recomiendo realizar éste proceso de arrancar y parar el freeswitch 2 veces.

Ahora podremos entrar ya a la consola fs_cli

root@freeswitch19-capa8:/usr/local/freeswitch/log# cd /usr/local/freeswitch/bin/
root@freeswitch19-capa8:/usr/local/freeswitch/bin# ./fs_cli

Podemos añadir /usr/local/freeswitch/bin/ a las variables de entorno y no tendremos que ir cada vez al directorio para ejecutar el cli

root@freeswitch19-capa8:/usr/local/freeswitch/bin# export PATH=$PATH:/usr/local/freeswitch/bin
root@freeswitch19-capa8:/usr/local/freeswitch/bin# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/freeswitch/bin
root@freeswitch19-capa8:~# fs_cli 
.=======================================================.
|            _____ ____     ____ _     ___              |
|           |  ___/ ___|   / ___| |   |_ _|             |
|           | |_  \___ \  | |   | |    | |              |
|           |  _|  ___) | | |___| |___ | |              |
|           |_|   |____/   \____|_____|___|             |
|                                                       |
.=======================================================.
| Anthony Minessale II, Ken Rice,                       |
| Michael Jerris, Travis Cross                          |
| FreeSWITCH (http://www.freeswitch.org)                |
| Paypal Donations Appreciated: paypal@freeswitch.org   |
| Brought to you by ClueCon http://www.cluecon.com/     |
.=======================================================.

.=======================================================================================================.
|    ____ _             ____                                                                            |
|   / ___| |_   _  ___ / ___|___  _ __                                                                  |
|  | |   | | | | |/ _ \ |   / _ \| '_ \                                                                 |
|  | |___| | |_| |  __/ |__| (_) | | | |                                                                |
|   \____|_|\__,_|\___|\____\___/|_| |_|                                                                |
|                                                                                                       |
|   _____    _            _                          ____             __                                |
|  |_   _|__| | ___ _ __ | |__   ___  _ __  _   _   / ___|___  _ __  / _| ___ _ __ ___ _ __   ___ ___   |
|    | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | |   / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \  |
|    | |  __/ |  __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | |  _|  __/ | |  __/ | | | (_|  __/  |
|    |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, |  \____\___/|_| |_|_|  \___|_|  \___|_| |_|\___\___|  |
|                  |_|                      |___/                                                       |
|   _____                           _                         _                                         |
|  | ____|_   _____ _ __ _   _     / \  _   _  __ _ _   _ ___| |_                                       |
|  |  _| \ \ / / _ \ '__| | | |   / _ \| | | |/ _` | | | / __| __|                                      |
|  | |___ \ V /  __/ |  | |_| |  / ___ \ |_| | (_| | |_| \__ \ |_                                       |
|  |_____| \_/ \___|_|   \__, | /_/   \_\__,_|\__, |\__,_|___/\__|                                      |
|                        |___/                |___/                                                     |
|                                       ____ _             ____                                         |
|  __      ____      ____      __      / ___| |_   _  ___ / ___|___  _ __         ___ ___  _ __ ___     |
|  \ \ /\ / /\ \ /\ / /\ \ /\ / /     | |   | | | | |/ _ \ |   / _ \| '_ \       / __/ _ \| '_ ` _ \    |
|   \ V  V /  \ V  V /  \ V  V /   _  | |___| | |_| |  __/ |__| (_) | | | |  _  | (_| (_) | | | | | |   |
|    \_/\_/    \_/\_/    \_/\_/   (_)  \____|_|\__,_|\___|\____\___/|_| |_| (_)  \___\___/|_| |_| |_|   |
|                                                                                                       |
.=======================================================================================================.

Type /help  to see a list of commands




[This app Best viewed at 160x60 or more..]
+OK log level  [7]
freeswitch@freeswitch19-capa8>

ACTUALIZACIONES: PARA INSTALAR EN DEBIAN 9
Al instalar las dependencias cambia de nombre libsndfile-dev a libsndfile1-dev

libsndfile-dev -> libsndfile1-dev

Al ejecutar el script no encuentra el paquete npm que no está en debian 9, pero en debian sid si. Nos descargamos el fichero de los repositorios sid de debian y lo instalamos

root@freeswitch-capa8:/usr/src# wget -c http://ftp.us.debian.org/debian/pool/main/n/npm/npm_1.4.21+ds-2_all.deb
root@freeswitch-capa8:/usr/src# dpkg -i npm_1.4.21+ds-2_all.deb
root@freeswitch-capa8:/usr/src# apt-get -f install

Una vez arreglada la dependencia volvemos a ejecutar el script FreeSWITCH-debian-raspbian-installer.sh

ya cuando hacemos el configure activando el postgresql, nos pide una dependencia, así que antes de ejecutar el configure, instalamos ésta dependencia

root@freeswitch-capa8:/usr/src/freeswitch.git# apt-get install libldns-dev
root@freeswitch-capa8:/usr/src/freeswitch.git# ./configure --enable-core-pgsql-support
root@freeswitch-capa8:/usr/src/freeswitch.git# make
root@freeswitch-capa8:/usr/src/freeswitch.git# make install

Mas adelante cambia la ubicación del fichero hba.conf

root@freeswitch-capa8:/usr/local/freeswitch/conf# vi /etc/postgresql/9.6/main/pg_hba.conf

Han quedado algunas bases de datos creadas sobre sqlite3, así supongo que tendremos que añadir la línea de configuración en los ficheros correspondientes en confs

root@freeswitch-capa8:/usr/local/freeswitch/db# ls
fifo.db  json.db  sofia_reg_external.db  sofia_reg_external-ipv6.db
root@freeswitch-capa8:/usr/local/freeswitch/conf# vi autoload_configs/fifo.conf.xml
root@freeswitch-capa8:/usr/local/freeswitch/conf# vi autoload_configs/sofia.conf.xml

Recomiendo instalar también net-tools, para poder ver las conexiones y sockets y sngrep no es tampoco una mala herramienta ;)
[FIN ACTUALIZACIÓN]

Y aquí termina éste manual! :) Doy las gracias a los chicos de freeswitch-users que han tenido una gran paciencia conmigo y me han ayudado a identificar los problemas que tenía y a crear éste completo manual de instalación! mi pequeña aportación al proyecto! :D

May 23, 2018

Freeswitch en debian 9 sobre pgsql (fallido)

Venga, otra vez estamos aquí. Tras la infructuosa instalación de freeswitch 1.8 ésta mañana sobre debian 9, volvemos a intentarlo. Ahora la diferencia, son evidentemente la versión de debian, que compilaremos freeswitch en lugar de instalarlos desde los repositorios que petan por no estar usando una clave gpg compatible y que vamos a conectarlo a un postgree (pgsql).

De nuevo, partimos de una instalación nueva.

Empezaremos instalando todas las dependencias necesarias

root@freeswitch8-capa8:~# apt-get install git libpq-dev postgresql postgresql-client build-essential

git es para descargar el código de la rama máster de freeswitch, el libpq-dev lo necesitaremos mas adelante para hacer funcionar el pgsql con el freeswitch y ya puestos, para ponerle así un poco de rollo gnóstico empezando por el final, el postgresql ya de paso! y el build-essential porque nos vamos a poner en harina y a compilar el código.

Seguiremos pues, descargando el código git en nuestra máquina para poder compilarlo posteriormente.

root@freeswitch8-capa8:~# git clone https://freeswitch.org/stash/scm/fs/freeswitch.git
Cloning into 'freeswitch'...
remote: Counting objects: 307888, done.
remote: Compressing objects: 100% (67730/67730), done.
remote: Total 307888 (delta 239706), reused 298098 (delta 232095)
Receiving objects: 100% (307888/307888), 147.98 MiB | 2.64 MiB/s, done.
Resolving deltas: 100% (239706/239706), done.

Ahora veremos que nos ha creado un directorio y dentro de él está todo el código del freeswitch en la rama master.

root@freeswitch8-capa8:~# ls
freeswitch
root@freeswitch8-capa8:~# cd freeswitch/
root@freeswitch8-capa8:~/freeswitch# ls
acinclude.m4         cluecon.tmpl        dtd                                   freeswitch-sounds-en-us-callie.spec  htdocs       support-d
bootstrap.sh         cmake_modules       erlang.spec                           freeswitch-sounds-fr-ca-june.spec    html5        swig_common.i
build                conf                fonts                                 freeswitch-sounds-music.spec         images       tests
cc.sh                configure.ac        Freeswitch.2015.sln                   freeswitch-sounds-pt-BR-karina.spec  INSTALL      w32
clients              debian              Freeswitch.2015.sln.bat               freeswitch-sounds-ru-RU-elena.spec   libs         web
cluecon2_small.tmpl  devel-bootstrap.sh  freeswitch-config-rayo.spec           freeswitch-sounds-sv-se-jakob.spec   Makefile.am  yum
cluecon2.tmpl        docker              freeswitch-sounds-en-ca-june.spec     freeswitch.spec                      scripts
cluecon_small.tmpl   docs                freeswitch-sounds-en-us-allison.spec  fscomm                               src

Ahora moveremos éste directorio a /usr/src. No sabía muy bien donde ponerla, pero los manuales lo suelen poner ahí. Así que vamos a respetarlo.

root@freeswitch8-capa8:~/freeswitch# cd ..
root@freeswitch8-capa8:~# mv freeswitch /usr/src/
root@freeswitch8-capa8:~# cd /usr/src/freeswitch/

Ahora pues vamos a compilar freeswitch en su rama master e indicarle qué opciones extra queremos añadir a nuestro freeswitch.

Nota: en la documentación hay un rollo muy raro de una rama 1.6, que no me cuadra con la versión 1.8 que estoy tratando de instalar, he mirado al git de freeswitch y he visto que la rama con cambios mas recientes es la master. Así que suponemos que ésta sea la vía por la que tengamos que tirar… esperemos que los desarrolladores sean cuidadosos…

¡Joder! ya empezamos! ¡la documentación de dentro el código dice una cosa y la de la web otra! bueno… la del código todo muy bien explicado pero es una bazofia! me han decepcionado ya! a ver… hay unos ficheros con +x que no sabía lo que eran pero tenían muchas cosas dentro… vamos a ellos pues

root@freeswitch8-capa8:/usr/src/freeswitch# ./bootstrap.sh -j
bootstrap: checking installation...
bootstrap: autoconf not found.
           You need autoconf version 2.59 or newer installed
           to build FreeSWITCH from source.

Bueno, pues parece que empezamos con las versiones de las dependencias… ¡tóma! ¡come pesao!

root@freeswitch8-capa8:/usr/src/freeswitch# apt-get install autoconf

Y lo volvemos a intentar…

root@freeswitch8-capa8:/usr/src/freeswitch# ./bootstrap.sh -j
bootstrap: checking installation...
bootstrap: autoconf version 2.69 (ok)
bootstrap: automake version 1.15 (ok)
bootstrap: aclocal version 1.15 (ok)
bootstrap: libtool not found.
           You need libtool version 1.5.14 or newer to build FreeSWITCH from source.

Otra… bueno, os voy pasando las dependencias que requiere y ya lo instaláis todo de golpo… ésto que os ahorro… venga, un descanso…

root@freeswitch8-capa8:/usr/src/freeswitch# apt-get install autoconf libtool-bin

¡Ya estoy aquí de nuevo! bueno, de momento no ha sido para tanto! sólo 2 dependencias hehe…

Seguimos, ésto lleva aquí un rato compilando y de momento no he visto nada raro… vale, ésto ya ha terminado y parece que ahora si nos ha creado un fichero configure ejecutable en la raíz del programa. Vamos a probar lo que decía la configuración del código del ./configure –help

root@freeswitch8-capa8:/usr/src/freeswitch# ./configure --help
`configure' configures freeswitch 1.9.0 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/freeswitch]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/freeswitch/bin', `/usr/local/freeswitch/lib' etc.  You can specify
an installation prefix other than `/usr/local/freeswitch' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/freeswitch]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")
  --enable-64             build with 64 bit support
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --disable-fhs           Do Not follow the FHS when placing files and
                          directories (default only when not specifying prefix
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --enable-optimization   Set if you want us to add max optimising compiler
                          flags
  --enable-portable-binary
                          disable compiler optimizations that would produce
                          unportable binaries
  --enable-address-sanitizer
                          build with address sanitizer
  --disable-visibility    Disable or enable API visibility support (default:
                          use if available)
  --disable-debug         build without debug information
  --disable-libyuv        build without libyuv
  --disable-libvpx        build without libvpx
  --disable-cpp           build without cpp code
  --enable-system-xmlrpc-c
                          use system lib for xmlrpc-c
  --disable-srtp          build without srtp support
  --enable-zrtp           Compile with zrtp Support
  --enable-core-odbc-support
                          Compile with ODBC Support (default is optional)
  --enable-core-pgsql-support
                          Compile with PGSQL Support
  --disable-core-pgsql-pkgconfig
                          Use pg_config to get PGQSL build options
  --enable-deprecated-core-db-events
                          Keep deprecated core db events
  --disable-core-libedit-support
                          Compile without libedit Support
  --enable-static-v8      Statically link V8 into mod_v8
  --disable-parallel-build-v8
                          Disable parallel build of V8

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-modinstdir=DIR   Install modules into this location (default:
                          $prefix/mod)
  --with-rundir=DIR       Put pidfile into this location (default:
                          $prefix/run)
  --with-logfiledir=DIR   Put logfiles into this location (default:
                          $localstatedir/log)
  --with-dbdir=DIR        Put database files into this location (default:
                          $prefix/db)
  --with-htdocsdir=DIR    Put html files into this location (default:
                          $prefix/htdocs)
  --with-fontsdir=DIR     Put font files into this location (default:
                          $prefix/fonts)
  --with-soundsdir=DIR    Put sound files into this location (default:
                          $prefix/sounds)
  --with-grammardir=DIR   Put grammar files into this location (default:
                          $prefix/grammar)
  --with-certsdir=DIR     Put certs files into this location (default:
                          $prefix/certs)
  --with-scriptdir=DIR    Put script files into this location (default:
                          $prefix/scripts)
  --with-recordingsdir=DIR
                          Put recordings files into this location (default:
                          $prefix/recordings)
  --with-imagesdir=DIR    Put images files into this location (default:
                          $prefix/images)
  --with-storagedir=DIR   Put storage files into this location (default:
                          $prefix/storage)
  --with-cachedir=DIR     Put cache files into this location (default:
                          $prefix/cache)
  --with-pkgconfigdir=DIR Installation directory for pkgconfig file (default:
                          ${libdir}/pkgconfig)
  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                          both]
  --with-aix-soname=aix|svr4|both
                          shared library versioning (aka "SONAME") variant to
                          provide on AIX, [default=aix].
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
                          compiler's sysroot if not specified).
  --with-gcc-arch=  use architecture  for gcc -march/-mtune,
                          instead of guessing
  --with-lib-subdir=DIR   Find libraries in DIR instead of lib
  --with-odbc=PREFIX      Compile with ODBC support
  --with-odbc-lib=dir     use odbc libraries in dir
  --with-odbc-include=dir use odbc headers in dir
  --without-png           disable support for libpng
  --without-freetype      disable support for freetype
  --with-openssl          use OpenSSL [enabled]
  --with-java=PFX         prefix where 'java' is installed.
  --with-python           Use system provided version of python (default: try)
  --with-erlang           Use system provided version of erlang (default: try)

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L if you have libraries in a
              nonstandard directory 
  LIBS        libraries to pass to the linker, e.g. -l
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I if
              you have headers in a nonstandard directory 
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  LT_SYS_LIBRARY_PATH
              User-defined run-time library search path.
  CPP         C preprocessor
  CXXCPP      C++ preprocessor

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to .

¡TOMA! ¡LEE!

Vamos a centrarnos primero con a lo que hemos venido a éste post, a vincular el freeswitch con el postgresql: enable-core-pgsql-support

  --enable-core-odbc-support
                          Compile with ODBC Support (default is optional)
  --enable-core-pgsql-support
                          Compile with PGSQL Support
  --disable-core-pgsql-pkgconfig
                          Use pg_config to get PGQSL build options

Bueno, mala pinta no tiene… por lo menos aparece en el –help… y destaco también la posibilidad del uso de un conector de bases de datos… pero bueno… esta ya es otra historia… hoy vamos a usar postgresql, no mysql. Ya que nos ponemos con cosas nuevas pues ¡de cabeza!

Que mas hay por aquí… voy a ver que cosas suelo configurar en el asterisk cuando lo compilo y también cosas así de seguridad, el tema del tls y lo del proxyRTP, que no me ha quedado muy claro que si quieres un proxyRTP tienes que meterte ya en otro fregao, el de kamailio… un enrutador de paquetes SIP (lo que estamos instalando aquí es una centralita, donde están los buzones de los usuarios y su cuenta).

Bueno, parece que en el primer trozo pues te permite definir donde quieres guardar algunas cosas que supongo que va a crear por defecto, sino las meterá todas ahí donde le de la gana… ya veremos… veo algo de pdf (espero que mas documentación) y html… uhm… habrá algún tipo de interfaz web disponible para hacer algo?

Hay ésto otro

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

Los dos primeros supongo que los necesitaremos si nos da problemas para encontrar el libpq y lo tercero no sé… pero me inquieta un poco…

Algo de build system que decía algo en la documentación que está en los sources. Disable y Enable de muchas cosas… vete a saber tú cuales vienen por defecto activadas o desactivadas… vamos a darles un voto de fe a los desarrolladores y como en ningún otro sitio de su documentación a excepción de la del pgsql, pues otro repasito mas y adelante con el primer configure que me ha gustado.

¡va! ¡sin dolor!

./configure --enable-core-pgsql-support

Cruzando dedos… no te quejes de dependencias… no te quejes de dependencias…

root@freeswitch8-capa8:/usr/src/freeswitch# apt-get install zlib1g-dev libjpeg-dev pkg-config libsqlite3-dev libcurl4-gnutls-dev libpcre3-dev libogg-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libtiff5-dev

Ahora le damos a dar otra vez al configure

root@freeswitch8-capa8:/usr/src/freeswitch# ./configure --enable-core-pgsql-support

[[[ muchas cosas aquí en medio ]]]

-------------------------- FreeSWITCH configuration --------------------------

  Locations:

      prefix:          /usr/local/freeswitch
      exec_prefix:     /usr/local/freeswitch
      bindir:          ${exec_prefix}/bin
      confdir:         /usr/local/freeswitch/conf
      libdir:          ${exec_prefix}/lib
      datadir:         /usr/local/freeswitch
      localstatedir:   /usr/local/freeswitch
      includedir:      /usr/local/freeswitch/include/freeswitch

      certsdir:        /usr/local/freeswitch/certs
      dbdir:           /usr/local/freeswitch/db
      grammardir:      /usr/local/freeswitch/grammar
      htdocsdir:       /usr/local/freeswitch/htdocs
      fontsdir:        /usr/local/freeswitch/fonts
      logfiledir:      /usr/local/freeswitch/log
      modulesdir:      /usr/local/freeswitch/mod
      pkgconfigdir:    ${exec_prefix}/lib/pkgconfig
      recordingsdir:   /usr/local/freeswitch/recordings
      imagesdir:       /usr/local/freeswitch/images
      runtimedir:      /usr/local/freeswitch/run
      scriptdir:       /usr/local/freeswitch/scripts
      soundsdir:       /usr/local/freeswitch/sounds
      storagedir:      /usr/local/freeswitch/storage
      cachedir:        /usr/local/freeswitch/cache

------------------------------------------------------------------------------

et voilà! ahora siguiente paso, make, make check (recomendable) y finalmente make install.

root@freeswitch8-capa8:/usr/src/freeswitch# make
[[[ aquí, cosas ]]]
Neither yasm nor nasm have been found. See the prerequisites section in the README for more info.

Configuration failed. This could reflect a misconfiguration of your
toolchains, improper options selected, or another problem. If you
don't see any useful error messages above, the next step is to look
at the configure error log file (config.log) to determine what
configure was trying to do when it died.
Makefile:4011: recipe for target 'libs/libvpx/Makefile' failed
make: *** [libs/libvpx/Makefile] Error 1
root@freeswitch8-capa8:/usr/src/freeswitch# apt-cache search yasm
yasm - modular assembler with multiple syntaxes support
root@freeswitch8-capa8:/usr/src/freeswitch# apt-get install yasm

Yaaaaasmm… nada en la documentación pero bueno… vamos a suponer que yasm…

Siguen los problemas y no se por donde avanzar, he visto un directorio debian con un bootstrap, supongo que ésto será lo que construirá las dependencias antes de compilar… bueno probamos por aquí…

root@freeswitch8-capa8:/usr/src/freeswitch# debian/bootstrap.sh
Bootstrapping debian/ for sid

Please wait, this takes a few seconds...
Adding any new modules to control-modules...
Parsing control-modules...
Displaying includes/excludes...
Generating modules_.conf...
Generating control-modules.gen as sanity check...
Accumulating dependencies from modules...
Generating debian/...
Generating debian/ (conf)...
Generating debian/ (lang)...
Generating debian/ (modules)...
Generating additional lintian overrides...
Cleaning up...
Done bootstrapping debian/

Retrocedemos al ./configure

root@freeswitch8-capa8:/usr/src/freeswitch# ./configure --enable-core-pgsql-support
root@freeswitch8-capa8:/usr/src/freeswitch# make

Nada estoy atascada sigo probando otras cosas, veo que hay un directorio de scripts. Bueno, ahora acabo de liarla un poco, pero bueno haha, ya lo arreglaré cuando haga una instalación nueva… Dentro del directorio éste de scripts hay varios scripts, he ejecutado freeswitch.pkg_deps.sh y debian_min_build.sh. El segundo script parece que ha creado la librería que requeríamos para el error que me salía

mod_lua.cpp:37:17: fatal error: lua.h: No such file or directory
 #include "lua.h"
root@freeswitch8-capa8:/usr/src/freeswitch/scripts# ./freeswitch.pkg_deps.sh 
root@freeswitch8-capa8:/usr/src/freeswitch/scripts# ./debian_min_build.sh 

Buscando como arreglar éste problema me he dado cuenta que el script debian_min_build.sh que compila freeswitch 1.6, genera en el directorio usr/mod/languages/mod_lua varias librerías, así que he copiado las librerías que se crean en /usr/src/freeswitch.git/src/mod/languages/mod_lua/.libs al src/mod/languages/mod_lua/ de la versión 1.8 que estamos compilando (si, lo admito, una chapuza, pero quiero avanzar hahaha)

root@freeswitch8-capa8:/usr/src/freeswitch# find . |grep mod_lua.so
./src/mod/languages/mod_lua/.libs/mod_lua.so

Después por ahí he leído de probar de ejecutar autoreconf sobre el directorio base del código

root@freeswitch8-capa8:/usr/src/freeswitch# autoreconf

He hecho el make otra vez y me salta otro error, bueno, vienen varios así… dependencias, vamos

root@freeswitch8-capa8:/usr/src/freeswitch# apt-get install libopus-dev libsndfile-dev
root@freeswitch8-capa8:/usr/src/freeswitch# autoreconf

El autoreconf es para que actualice la lista de liberías

Mas chapuzas

root@freeswitch8-capa8:/usr/src/freeswitch# cp /usr/lib/x86_64-linux-gnu/libsndfile.so src/mod/formats/mod_sndfile/.libs/

Eureka! lo siento, tengo que arreglar ésta parte, para instalar todas las dependencias a la misma parte, luego hacer la instalación neta y lo de la chapuza de mover la librería de la versión 1.6, pues se puede hacer como segunda opción, pero lo importante es ejecutar autoconfig, después ./configure –enable-core-pgsql-support, después make y luego ya te sale éste precioso mensaje

 +---------- FreeSWITCH Build Complete ----------+
 + FreeSWITCH has been successfully built.       +
 + Install by running:                           +
 +                                               +
 +                make install                   +
 +                                               +
 + While you're waiting, register for ClueCon!   +
 + https://www.cluecon.com                       +
 +                                               +
 +-----------------------------------------------+

.=======================================================================================================.
|    ____ _             ____                                                                            |
|   / ___| |_   _  ___ / ___|___  _ __                                                                  |
|  | |   | | | | |/ _ \ |   / _ \| '_ \                                                                 |
|  | |___| | |_| |  __/ |__| (_) | | | |                                                                |
|   \____|_|\__,_|\___|\____\___/|_| |_|                                                                |
|                                                                                                       |
|   _____    _            _                          ____             __                                |
|  |_   _|__| | ___ _ __ | |__   ___  _ __  _   _   / ___|___  _ __  / _| ___ _ __ ___ _ __   ___ ___   |
|    | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | |   / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \  |
|    | |  __/ |  __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | |  _|  __/ | |  __/ | | | (_|  __/  |
|    |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, |  \____\___/|_| |_|_|  \___|_|  \___|_| |_|\___\___|  |
|                  |_|                      |___/                                                       |
|   _____                           _                         _                                         |
|  | ____|_   _____ _ __ _   _     / \  _   _  __ _ _   _ ___| |_                                       |
|  |  _| \ \ / / _ \ '__| | | |   / _ \| | | |/ _` | | | / __| __|                                      |
|  | |___ \ V /  __/ |  | |_| |  / ___ \ |_| | (_| | |_| \__ \ |_                                       |
|  |_____| \_/ \___|_|   \__, | /_/   \_\__,_|\__, |\__,_|___/\__|                                      |
|                        |___/                |___/                                                     |
|                                       ____ _             ____                                         |
|  __      ____      ____      __      / ___| |_   _  ___ / ___|___  _ __         ___ ___  _ __ ___     |
|  \ \ /\ / /\ \ /\ / /\ \ /\ / /     | |   | | | | |/ _ \ |   / _ \| '_ \       / __/ _ \| '_ ` _ \    |
|   \ V  V /  \ V  V /  \ V  V /   _  | |___| | |_| |  __/ |__| (_) | | | |  _  | (_| (_) | | | | | |   |
|    \_/\_/    \_/\_/    \_/\_/   (_)  \____|_|\__,_|\___|\____\___/|_| |_| (_)  \___\___/|_| |_| |_|   |
|                                                                                                       |
.=======================================================================================================.


make[2]: Leaving directory '/usr/src/freeswitch/build'
make[1]: Leaving directory '/usr/src/freeswitch'

Ahora siguiente paso, el make check. Pues nada, olvidadlo el make check, porque da problemas también, así que directamente he puesto valor y he ejecutado el make install

root@freeswitch8-capa8:/usr/src/freeswitch# make install
[[[ mucho texto - mucho texto - mucho texto ]]]
 +---------- FreeSWITCH install Complete ----------+
 + FreeSWITCH has been successfully installed.     +
 +                                                 +
 +       Install sounds:                           +
 +       (uhd-sounds includes hd-sounds, sounds)   +
 +       (hd-sounds includes sounds)               +
 +       ------------------------------------      +
 +                make cd-sounds-install           +
 +                make cd-moh-install              +
 +                                                 +
 +                make uhd-sounds-install          +
 +                make uhd-moh-install             +
 +                                                 +
 +                make hd-sounds-install           +
 +                make hd-moh-install              +
 +                                                 +
 +                make sounds-install              +
 +                make moh-install                 +
 +                                                 +
 +       Install non english sounds:               +
 +       replace XX with language                  +
 +       (ru : Russian)                            +
 +       (fr : French)                             +
 +       ------------------------------------      +
 +                make cd-sounds-XX-install        +
 +                make uhd-sounds-XX-install       +
 +                make hd-sounds-XX-install        +
 +                make sounds-XX-install           +
 +                                                 +
 +       Upgrade to latest:                        +
 +       ----------------------------------        +
 +                make current                     +
 +                                                 +
 +       Rebuild all:                              +
 +       ----------------------------------        +
 +                make sure                        +
 +                                                 +
 +       Install/Re-install default config:        +
 +       ----------------------------------        +
 +                make samples                     +
 +                                                 +
 +                                                 +
 +       Additional resources:                     +
 +       ----------------------------------        +
 +       https://www.freeswitch.org                +
 +       https://freeswitch.org/confluence         +
 +       https://freeswitch.org/jira               +
 +       http://lists.freeswitch.org               +
 +                                                 +
 +       irc.freenode.net / #freeswitch            +
 +                                                 +
 +       Register For ClueCon:                     +
 +       ----------------------------------        +
 +       https://www.cluecon.com                   +
 +                                                 +
 +-------------------------------------------------+

.=======================================================================================================.
|    ____ _             ____                                                                            |
|   / ___| |_   _  ___ / ___|___  _ __                                                                  |
|  | |   | | | | |/ _ \ |   / _ \| '_ \                                                                 |
|  | |___| | |_| |  __/ |__| (_) | | | |                                                                |
|   \____|_|\__,_|\___|\____\___/|_| |_|                                                                |
|                                                                                                       |
|   _____    _            _                          ____             __                                |
|  |_   _|__| | ___ _ __ | |__   ___  _ __  _   _   / ___|___  _ __  / _| ___ _ __ ___ _ __   ___ ___   |
|    | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | |   / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \  |
|    | |  __/ |  __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | |  _|  __/ | |  __/ | | | (_|  __/  |
|    |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, |  \____\___/|_| |_|_|  \___|_|  \___|_| |_|\___\___|  |
|                  |_|                      |___/                                                       |
|   _____                           _                         _                                         |
|  | ____|_   _____ _ __ _   _     / \  _   _  __ _ _   _ ___| |_                                       |
|  |  _| \ \ / / _ \ '__| | | |   / _ \| | | |/ _` | | | / __| __|                                      |
|  | |___ \ V /  __/ |  | |_| |  / ___ \ |_| | (_| | |_| \__ \ |_                                       |
|  |_____| \_/ \___|_|   \__, | /_/   \_\__,_|\__, |\__,_|___/\__|                                      |
|                        |___/                |___/                                                     |
|                                       ____ _             ____                                         |
|  __      ____      ____      __      / ___| |_   _  ___ / ___|___  _ __         ___ ___  _ __ ___     |
|  \ \ /\ / /\ \ /\ / /\ \ /\ / /     | |   | | | | |/ _ \ |   / _ \| '_ \       / __/ _ \| '_ ` _ \    |
|   \ V  V /  \ V  V /  \ V  V /   _  | |___| | |_| |  __/ |__| (_) | | | |  _  | (_| (_) | | | | | |   |
|    \_/\_/    \_/\_/    \_/\_/   (_)  \____|_|\__,_|\___|\____\___/|_| |_| (_)  \___\___/|_| |_| |_|   |
|                                                                                                       |
.=======================================================================================================.


Checking module integrity in target [/usr/local/freeswitch/mod]


make[2]: Leaving directory '/usr/src/freeswitch/build'
make[1]: Leaving directory '/usr/src/freeswitch'

Bueno… pues no sé… ahora a ver si está funcionando o si arranca, no?

Arranca, pero no del todo… además se tiene que crear la base de datos y tal.

Si queremos limpiar un poco la basura que ha dejado por ahí make clean. Yo no lo hago por si las moscas… con la de curro que me ha dado el muy cabrón!

Lo dejo por hoy, ha sido una ardua batalla, pero la maquina ha vencido al humano…

May 22, 2018

Instalación freeswitch en debian 8

Iba a mostrar la instalación para debian 9, pero debido a cambios con apt en debian 9, que se ha desactivado el soporte de SHA-1 para la firma de los repositorios y que freeswitch requiere la firma con éste cifrado, no hay otra opción que usar debian 8 de momento.

Partimos de una debian 8 recién instalada.

Configuramos el repositorio

root@freeswitch-capa8:~# wget -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -
root@freeswitch-capa8:~# echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
root@freeswitch-capa8:~# apt-get update
root@freeswitch-capa8:~# apt-get install -y --force-yes freeswitch-meta-all

Está disponible la versión 1.8, pero no hay forma de instalarla dentro de debian 8, no voy a entrar en detalles, así que de momento tiramos con la versión 1.6 en lugar de la 1.8. La documentación recomienda usar 1.6 con debian 8 para entornos de producción, también tiene pinta que está un poco dejada… al igual que el problema con los repositorios… per bueno…

Ahora ya tenemos freeswitch instalado

root@freeswitch-capa8:/home/capa8# netstat -lanp |grep freeswitch
tcp        0      0 10.90.226.81:5060       0.0.0.0:*               LISTEN      10374/freeswitch
tcp        0      0 10.90.226.81:5066       0.0.0.0:*               LISTEN      10374/freeswitch
tcp        0      0 10.90.226.81:8081       0.0.0.0:*               LISTEN      10374/freeswitch
tcp        0      0 10.90.226.81:8082       0.0.0.0:*               LISTEN      10374/freeswitch
tcp        0      0 10.90.226.81:7443       0.0.0.0:*               LISTEN      10374/freeswitch
tcp        0      0 10.90.226.81:5080       0.0.0.0:*               LISTEN      10374/freeswitch
tcp6       0      0 2001:470:1f13:6c9::8081 :::*                    LISTEN      10374/freeswitch
tcp6       0      0 2001:470:1f13:6c9::8082 :::*                    LISTEN      10374/freeswitch
tcp6       0      0 :::8021                 :::*                    LISTEN      10374/freeswitch
udp        0      0 10.90.226.81:5060       0.0.0.0:*                           10374/freeswitch
udp        0      0 10.90.226.81:5080       0.0.0.0:*                           10374/freeswitch
udp        0      0 0.0.0.0:1337            0.0.0.0:*                           10374/freeswitch
unix  3      [ ]         STREAM     CONNECTED     20097    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     27056    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     27055    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20094    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20110    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     27047    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20111    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     27048    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20112    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20113    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20096    10374/freeswitch    
unix  3      [ ]         STREAM     CONNECTED     20095    10374/freeswitch   

Para acceder a la consola de freeswitch ejecutamos lo siguiente:

root@freeswitch-capa8:/home/capa8# fs_cli -rRS
.=======================================================.
|            _____ ____     ____ _     ___              |
|           |  ___/ ___|   / ___| |   |_ _|             |
|           | |_  \___ \  | |   | |    | |              |
|           |  _|  ___) | | |___| |___ | |              |
|           |_|   |____/   \____|_____|___|             |
|                                                       |
.=======================================================.
| Anthony Minessale II, Ken Rice,                       |
| Michael Jerris, Travis Cross                          |
| FreeSWITCH (http://www.freeswitch.org)                |
| Paypal Donations Appreciated: paypal@freeswitch.org   |
| Brought to you by ClueCon http://www.cluecon.com/     |
.=======================================================.

.=======================================================================================================.
|    ____ _             ____                                                                            |
|   / ___| |_   _  ___ / ___|___  _ __                                                                  |
|  | |   | | | | |/ _ \ |   / _ \| '_ \                                                                 |
|  | |___| | |_| |  __/ |__| (_) | | | |                                                                |
|   \____|_|\__,_|\___|\____\___/|_| |_|                                                                |
|                                                                                                       |
|   _____    _            _                          ____             __                                |
|  |_   _|__| | ___ _ __ | |__   ___  _ __  _   _   / ___|___  _ __  / _| ___ _ __ ___ _ __   ___ ___   |
|    | |/ _ \ |/ _ \ '_ \| '_ \ / _ \| '_ \| | | | | |   / _ \| '_ \| |_ / _ \ '__/ _ \ '_ \ / __/ _ \  |
|    | |  __/ |  __/ |_) | | | | (_) | | | | |_| | | |__| (_) | | | |  _|  __/ | |  __/ | | | (_|  __/  |
|    |_|\___|_|\___| .__/|_| |_|\___/|_| |_|\__, |  \____\___/|_| |_|_|  \___|_|  \___|_| |_|\___\___|  |
|                  |_|                      |___/                                                       |
|   _____                           _                         _                                         |
|  | ____|_   _____ _ __ _   _     / \  _   _  __ _ _   _ ___| |_                                       |
|  |  _| \ \ / / _ \ '__| | | |   / _ \| | | |/ _` | | | / __| __|                                      |
|  | |___ \ V /  __/ |  | |_| |  / ___ \ |_| | (_| | |_| \__ \ |_                                       |
|  |_____| \_/ \___|_|   \__, | /_/   \_\__,_|\__, |\__,_|___/\__|                                      |
|                        |___/                |___/                                                     |
|                                       ____ _             ____                                         |
|  __      ____      ____      __      / ___| |_   _  ___ / ___|___  _ __         ___ ___  _ __ ___     |
|  \ \ /\ / /\ \ /\ / /\ \ /\ / /     | |   | | | | |/ _ \ |   / _ \| '_ \       / __/ _ \| '_ ` _ \    |
|   \ V  V /  \ V  V /  \ V  V /   _  | |___| | |_| |  __/ |__| (_) | | | |  _  | (_| (_) | | | | | |   |
|    \_/\_/    \_/\_/    \_/\_/   (_)  \____|_|\__,_|\___|\____\___/|_| |_| (_)  \___\___/|_| |_| |_|   |
|                                                                                                       |
.=======================================================================================================.

Type /help  to see a list of commands



+OK log level  [7]
freeswitch@freeswitch-capa8> 

De momento me quedo aquí, espero en las próximas horas o días hacer otro post explicativo de como instalar freeswitch 1.8 sobre debian 9.

May 12, 2018

Mis andanzas y conocimientos: uno no aprende del día a la mañana

Nunca me he considerado una buena programadora, pero hoy tenía las ganas de avanzar un poco con mi nivel de programación… Realmente, siempre he sido una muy mala programadora, porque no era capaz de entender los conceptos que estaba leyendo o me estaban enseñando. Es simplemente que el enfoque era simplemente incorrecto. Es por ésto que muchas veces me atasco con tonterías…

Aprendí a programar y realmente hacer algo útil con lo aprendido en 2001 (lo de antes con el html en 1998 eran garabatos), cuando tuve la oportunidad de crear un programa para gestionar una imprenta en la que curraba en Cornellà. Además ahí ya estaba empezando a aburrirme, estaba jugando ya con un servidor en gnu/linux, y estaba jugando en hacer pequeños programillas chorras, como descargar los frames del radar de lluvias de la web de metereología y ponerlos en un gif para poderlo visualizar en el applet del tiempo de gnome2. Con ésto pillé curiosidad y sin darme cuenta ya estaba programando y cuando llegó la propuesta (que un poco fue mía porque estaba entusiasmada con lo que estaba haciendo… ¡estaba creando!) pues estaba preparada para ir más allá, con un objetivo, una meta.

La programación que aprendí era muy simple, al principio no había ni siquiera funciones, había una página php con todo su código html repetido para cada página, ¡un horror!, poco a poco conocí a las funciones y pude darme cuenta que podía reducir muchísimo código e ir mucho más rápido a medida que iba alcanzando objetivos funcionales del programa, desde recoger la información del cliente, con el presupuesto, que podías pasarlo al departamento de edición, para su maquetación, ahí a ctp y luego a impresión, ya cuando estaba a punto de irme de la empresa, estaba en la parte de calcular los tiempos de impresión de forma automática y poder así planificar las impresiones y aumentar el rendimiento de las máquinas, ahorrando los cambios de colores continuos que obligan a tener la producción en marcha. El proyecto, lo estuve siguiendo durante un año, como siempre funcionaba pues había poco contacto, hasta que llegó un día que se estropeó el servidor, no me avisaron y simplemente volvieron al sistema viejo, el sobre con la ficha pegada en una cara y éstos sobres apilados en el mueble de entrada en el departamento de diseño. Aquella gente, no supo reaccionar y se quedó atrás… espero que a día de hoy ya estén un poco mas modernizados, en unos momentos que se tiene que buscar la alta productividad y unos costes menores.

Tras la muerte de aquel programa, estaba agobiada por programación en el ciclo formativo, que me había quemado un poco porque mientras programaba el db3, el programa de la imprenta, dejé un poco de lado la programación, además que en el trabajo nuevo en el que estaba, tenía que aprender a usar un lenguaje de programación de Navision financials que era vomitivo! el C/AL. Lo intentaba, pero por mas que lo intentaba era incapaz de hacer cosas con aquel lenguaje… incluso ahí traté de entender el lenguaje de programación C/AL en comparación con lo que había aprendido programando db3. No podía! y terminé enganchandóme de nuevo al PHP, ya estaba empezando a jugar con mas soltura la consola gnu/linux y empezaba mis pinitos con el bash scripting. Pasó el tiempo y mi interés por el C/AL decrecía, estaba centrada migrando el NT4 a active directory, ahí aprendí muchísimo de windows, directamente a las tripas! además que tenía ganas de estar con gente y atendía con excelencia a los usuarios. Mientras había algunos problemas en casa, el trabajo era mi sitio de huída, hasta en 2009, que la empresa hizo un ERE y me quedé en la calle… como ya me lo olía, me puse a buscar trabajo “por si a caso”, para ver lo que había en el mercado laboral, como asomar un poquitín así la cabeza… pam! ERE (también admito que mi rendimiento había bajado un poco porque me estaba entusiasmando con otras cosas) a la semana siguiente ya estaba en una consultora.

Ahí pude crecer mucho a nivel técnico, entendí la importancia de muchas cosas de mi antiguo trabajo, además meses antes de tener que irme de la otra empresa, me habían apuntado a un curso de nosecuantasporrecientas horas sobre el plan general contable del 2009. Para mi aquel curso era como las libretas éstas de contabilidad, con un lado rojo o azul, que sirve para marcar todas las entradas y salidas de dinero, con una serigrafía de como si hubiesen puesto una jirafa dentro de una lavadora. Al ir avanzando el curso, pasaron muchas cosas, incluso desaparecí durante un mes (nadie a excepción de mi jefe y la casera sabían donde me escondía de todo durante aquel mes de Marzo), con mi portátil y un cdrom con una instalación offline de freeBSD y también de gentoo… tenía el móvil parado y estaba usando otro telefono con otra sim para si necesitaba el móvil para una emergencia. La casera era psicologa en un colegio, no supe aprovechar la ocasión, simplemente me encerré en mi. Apenas recuerdo nada de aquellos días, sólo algunas imágenes de momentos que me reservo.

El cambio de trabajo me hizo espabilar, prepararme para dar el salto a empezar a crecer como persona, a hacer lo que realmente te gusta. El trabajo lo disfrazaban todo como muy bonito, pero ahí había cosas estrañas con los contratos o que mi forma de funcionar quizás no les estaba encajando, yo hacía el trabajo que me pedían, pero siempre era como que no estaba nunca bien del todo… esto me convirtió en una persona mucho mas exigente. Además de herida por lo ocurrido durante muchísimos años, exigente y con miedo a los cambios.

Finalmente en 2011, 10 años mas tarde de haber empezado a trabajar como informática, después del 11-M, guifi.net, de los hacklabs, las casas okupas, la chispa de estar siempre haciendo cosas y de estar siempre arriba y abajo, atareada para ocultar mis demonios, mantener la cabeza ocupada y en continua conversación y poco a poco ir desconectando de lo que realmente quería, estaba ayudando a los demás porqué yo quería simplemente ayudar a los demás, para tratar de recibir su aprobación, pero estaba rodeada de gente muy tóxica, en aquella época no avancé absolutamente nada a nivel de programación, si quizás a nivel de sistemas y redes gracias a un proyecto en el que estaba en la consultora y guifi. Hasta que mi cuerpo simplemente dijo basta, no me acuerdo de si días antes del summercamp, ahí simplemente fue cuando desaparecí de la órbita. Terminé con las cosas que no podía dejar sueltas y el resto simplemente lo tiré por la ventana.

Me pasé los siguientes dos años dando vueltas por toda la península, dando charlas de guifi.net, administrando servidores, aprendiendo sobre wordpress, mediawiki, mailman, mikrotik, networking, internet, etc. poco a poco entendiendo realmente como funcionaban los sistemas por detrás, como mejorar su rendimiento y sobretodo su estabilidad, muchas veces desde una óptica holística, de sistemas que interactúan unos con otros (todo rollo muy cyberpunk!), y todo ésto con unos recursos mínimos. Máquinas que nos traía la gente. Todo ésto que venía de hacía meses atrás, en aquellos alrededores de los 2012, se estabilizó y permitió desarollar la parte más lógica del proyecto, el interactuar con la inteligencia de las máquinas, de que puedes controlarlas… ahí me puse de nuevo con la programación, mas concretamente con bash scripting, la idea era automatizar los errores que iban apareciendo en el sistema, a modo de parches hasta que pudiese solucionar definitivamente el problema, pero como estaba sola, no avanzaba, simplemente trabajé de forma casi inconsciente en hacer que cuatro chatarras pudiesen dar servicio, no a mucha gente, pero que oye! parecía que si que sabía cuidar alguna cosa y no se me daba mal, y los usuarios confíaban en el servicio que estaba ofreciendo, ¡ésto era nuevo!

La cosa fue avanzando hasta que un día salió la necesidad de generar un panel web para gestionar una centralita de telefóno, andábamos ya por los 2013 o 2014 mas o menos, junto a craem, hicimos una pequeña herramienta bastante funcional y permitía a una operadora no técnica administrar una centralita de teléfono, el servicio y el sistema estaba funcionando, y la empresa a la que le implantamos la bluebox, estaba descontenta porque el programa no era capaz de conectar con la aplicación que les estaba haciendo un desarrollador… yo ahí estaba abrumada, no era capaz de hacer lo que me estaban pidiendo, pensé incluso de dejarles directamente acceso a la base de datos… pero ésto era acceder a la máquina y ver la purria de código que hacía funcionar todo aquello (también el desarollador de la web del cliente era un poco estúpido y no me decía exactamente lo que quería). Siempre me he avergonzado de mi código cuando lo enseño, pero cuando lo programo, me enfado con él, y luego cuando veo que funciona me enamoro de aquel pedacito de código o incluso notar como poco a poco el programa se convierte en un monstruo y me siento mas responsable… ésta sensación la tengo con la whale, el programa que empecé a programar a partir de la bluebox (la bluebox se basaba en el db3, el software de la imprenta) pero mejorando muchísimo el código.
Vamos que aquella empresa dejó de usar nuestro programa y se llevó con él a la persona que controlaba de la parte de asterisk. Pero no perdimos el contacto, seguimos implantando una centralita en capa8, ahí tuve que currarme todas aquellas ideas que me habían dado de mejoras en el programa y poco a poco las fuí implantando, iba mejorando el código y cuanto mas avanzaba menos tiempo tenías que invertir a gestionar la centralita y aumentabas el rendimiento… ¡otra vez! las maquinas están para ayudarnos y saber decirles lo que tienen que hacer, hay que interactuar con ellas!

Paralelamente la whale, que lo empecé en abril de 2016, tuvo varias fases, ya en una fase muy temprana empecé a usar git para poder desplegarla de forma automática o semiautomática (antes, cada vez que editaba un fichero lo subía por scp al servidor en cuestión), tuve que hacerlo porque tenía 2 whale en producción, la de lamardebits y la de capa8 (como curiosidad, la carpeta donde está la whale es lmdb). Con los otros dos chicos de lamardebits estoy aprendiendo mucho de sistemas, también a tratar de ir mas relajada, han habido momentos duros, pero ahora estamos en uno de muy dulce :)

A medida que iba desarrollando la whale, iba mejorando a veces cosillas de la bluebox, además un día me cansé del código de la bluebox y en un mes desarrollé casi desde 0 la bluebox, si ahora miras el código de la bluebox, podrás ver como programaba hace 2 años. Últimamente no tengo que tocar mucho la bluebox, salvo hace unos meses que tuve que hacer que la bluebox fuese multilingue, mas o menos por aquellos días también surgió el problema de un cliente de capa8 no aceptase una factura en catalán y tuve que editarla directamente con el inkscape, vamos superineficiente si nos lo pedían los clientes, así que me puse a saco a hacer la bluebox multilingue y cuando terminé me puse a hacer la facturación multilingue, en aquel momento no tenía tiempo para programar, así que hice un apaño, pero me anoté lo de revisar el código de la whale a fondo para ver como implantar la propiedad de multiidioma a la whale. El diseño base no es malo y permite a veces poder hacer ciertos frankensteins que quedan bastante bien cosidos… con el tiempo los mejoro e integro. Contínuamente voy revisando el código cuando se me hacen peticiones o los dos usuarios que tengo de éste programa no me usan las cosas que implanto o se quedan que es un rollo hacer algo, luego trato de darle un par de vueltas como agilizar el proceso y pam! aparece una nueva idea para avanzar.

Ayer fue un día de éstos, llevo unos días tonteando con el código de la whale, terminé la parte de proveedores, para agilizar la entrada de facturas de proveedores y poder así seguir con los libros contables, pero me apareció una idea para resolver una petición muy compleja de uno de los dos usuarios, el agilizar la creación de un documento (presupuesto, factura, etc.), ahí me animé y me puse a poner crucecitas de + en la tabla de usuarios, incluso le daba alegría un poco de verde entre tanto azul! y estoy de nueva enganchada a seguir mejorando el código… pero ésta vez es un momento de salto, supongo que también un poco una representación de como estoy internamente durante todos éstos días, que todo parece super plácido, tranquilo. Ayer, después de volver a llamar una función dentro de una función, decidí empezar a usar objetos y crear mis propias clases. Así que hoy me he puesto con ello, por la mañana tonteaba con la cabeza mientras le hacía una clase muy básica de programación en PHP a un chico de la oficina (además sin zapatos!) y por la tarde ya me he puesto a ello, pero me he atascado, me he agobiado un poco y cuando me he dado cuenta, he dicho, me voy a casa! en el viaje de vuelta, seguía mosca con que era lo que fallaba, además a medio camino empieza a charlarme una persona que me ha ofrecido su ayuda, pero como siempre, ¡PHP es una mierda! pero al llegar a casa finalmente ha terminando explicando donde estaba el problema, pero no era capaz de verlo… finalmente, tras analizarlo comparando la corrección que me ha hecho él y lo que tenía yo, lo he visto! en aquel momento algo ha hecho click en mi cabeza! la frase que había leído centenares de veces cada vez que me leía la documentación de las clases y los objetos, apareció de nuevo, pero ésta vez desde mi boca! una frase tan simple como “La classe es la definición del objeto” ha sido reveladora, ahí mi cabeza ha empezado a reestructurar el código y pensar cuál es la mejor manera para mejorar más aún el código.
Estaba tan entusiasmada que he seguido charlando con “el muso”, que he empezado a analizar un trozo de código de muy pocas líneas que hacía muchas cosas, y tratar de asociar lo que sabía de PHP a Python… a lo mejor trato de volver a mirar hacia Django… ya veremos! me estoy dejando llevar por lo que realmente quiero y necesito.

Cuando he decidido abrir el ordenador para anotar éstas palabras, que en un principio iban a ser sólo cuatro líneas, estaba reviviendo las sensaciones y las ocurrencias de éstos últimos días con la programación, las veces que he pensado en ella, sobretodo éstos dos últimos días y me ha venido a la cabeza una imagen de los objetos conectados a lo que aparece en la pantalla por vías en el suelo, los objetos se hallaban primero por el centro, pero poco a poco se iban extendiendo a todo alrededor, los objetos se representaban como pilares de madera, como de árboles huecos con vida dentro, la vida de dentro son las clases, lo que forman el alma del objeto, lo que permite hacerle llegar una orden con una información y devuelve un resultado o realiza una acción. Es como si el programa fuesen las manos ciberneticas del programador, y con una magia especial el programa cobra vida y pasa a ser un miembro mas del equipo, éste no pide un sueldo, éste pide horas, el dedicarle tiempo. Es como tener que cuidar el niño interior, como siempre estamos pendientes de lo que ocurre fuera, si un programa nos trae un beneficio lo mejoramos para que sea mas eficiente, en el interior, tenemos también un programa, pero muchas veces nos olvidamos de él, porque lo que nos aporta éste programa, muchas veces nos requiere mucha energía y de forma inconsciente solemos escapar, y es que éste programa, además de tiempo, requiere introspección, el pararse, el estar presente y ésto no es siempre fácil, para que haya tranquilidad interior, tiene que existir tranquilidad exterior, buscar cosas que nos hagan seguir avanzando y poder identificar aquellos destellos a través de los hechos diarios y cotidianos.