FritzBox : installer les applications AVM sans utiliser le Google Play Store

L’adresse du site FTP d’AVM afin de télécharger les applications FRitzBox Android sans utiliser le Google Play Store.

Les routeurs FritzBox proposent des fonctionnalités incroyables, loin devant les box opérateurs. Les équipements haut de gamme peuvent convenir aux petites entreprises en leur fournissant des services indispensables :

  • sécurité
  • routage
  • téléphonie (PABX)
  • mobilité WiFi et DECT
  • stockage

AVM, le constructeur des FritzBox proposent aussi des applications pour les terminaux fonctionnant sous IOS et Android. Mais si vous ne souhaitez pas utiliser le play store d’Android, vous pouvez les télécharger directement sur leur ftp :

MyFRITZ!App: http://update.avm.de/fapp/MyFRITZ.apk

FRITZ!App Cam: http://update.avm.de/fapp/FritzAppCam.apk

FRITZ!App Fon: http://update.avm.de/fapp/FritzApp.apk

FRITZ!App Fon Labor: http://update.avm.de/fapp/FritzAppLabor.apk

FRITZ!App Media: http://update.avm.de/fapp/FritzAppMedia.apk

FRITZ!App Ticker: http://update.avm.de/fapp/FritzAppTicker.apk

FRITZ!App TV: httphttp://update.avm.de/fapp/FritzAppTV.apk

FRITZ!App WLAN: http://update.avm.de/fapp/FritzAppWLAN.apk

Hiawatha : le serveur web léger et sécurisé à découvrir

Présentation de Hiawatha, un serveur web léger, performant et sécurisé et de plus simple à configurer.

Introduction

J’étais à la recherche d’un serveur web léger et sécurisé afin de succéder à Cherokee. En effet, ce dernier ne semble plus maintenu. Après de nombreux tests, j’ai retenu Hiawatha.

Description de Hiawatha

Le serveur web Hiawatha a été créé en 2002 par un étudiant Hollandais du nom de Leisink. L’objectif était de pouvoir réutiliser de vieux serveurs comme serveurs web sans négliger la sécurité. Ainsi, est né ce serveur web qui est reconnu pour sa légèreté, sa performance et sa sécurité. Autre point important, le projet a remplace OpenSSL qui se débat au milieu de nombreux problèmes de sécurité par PolarSSL dès janvier 2012.

Hiawatha web server integre nativement de nombreuses fonctionnalités qui ne sont disponibles qu’au sein de modules dans d’autres serveurs (Apache par exemple). Cette intégration permet de gagner en efficacité et en sécurité.

Un autre point important concerne la simplicité de configuration. L’ensemble de la configuration est claire et se fait au sein d’un unique fichier de configuration.

Fonctionnalités

Installation de Hiawatha

L’installation de Hiawatha sur un serveur Debian/Ubuntu est simplifiée par la mise à disposition de paquets Debian Hiawatha par Chris WADGE.

Vous trouverez sur le site la liste des paquets non officiels pour votre distribution préférée.

Mais, il existe aussi un script shell très bien fait permettant une installation simplifiée d’un serveur complet intégrant Hiawatha, MariaDB, php-fpm et même wordpress ! Il suffit de changer la version du paquet Debian selon les releases (lignes 34 et 37) et d’exécuter le script.

Hiawatha script installation serveur web mariadb php-fpm

Présentation de Hiawatha

Je vous laisse découvrir cette présentation faite par le créateur de ce superbe serveur web.

Conclusion

J’ai été séduit par la qualité de ce serveur web. Je suis en train de tester l’integration avec Django et très prochainement, mes serveurs WordPress vont tourner sous Hiawatha (J’écrirais un tuto si vous êtes intéressez).

Par ailleurs, j’ai évité de publier des benchmarks, il y en a un plusieurs disponibles sur le net. Je pense que le mieux est de réaliser des tests avec son application et ainsi obtenir des résultats proches de ses propres besoins.

Enfin, je vous invite à découvrir le script de configuration de iptables, Firetable, développé par le même créateur.

Migration WordPress : vidéo explicative

Retrouver une vidéo expliquant pas à pas la migration d’un site wordpress d’un hébergement à un autre (local ou distant)

WordPress et les flux rss : comment les utiliser ?

Souvent, l’ensemble des sujets traités sur un blog ne vous intéresse pas, mais juste une catégorie précise comme par exemple pour ce blog « FreeSwitch ». Afin d’éviter d’avoir son lecteur rss noyé par des articles ne correspondant pas à vos attentes, il est possible de s’abonner de manière ciblée grâce à la puissance des flux rss de wordpress.

Cet article va intéresser tous mes lecteurs, car je vais publier quelques articles dont le sujet sera bien éloigné des télécoms ou de l’informatique, mais sur des sujets qui me plaisent. Plutôt que de créer plusieurs blogs spécifiques, je préfère utiliser celui-ci : maintenance simplifiée (quand on a peu de temps, c’est indispensable), et je n’ai pas assez de temps pour alimenter sérieusement des blogs séparés. Vous allez donc découvrir comment vous abonner de manière spécifique à ces nouvelles thématiques ou au contraire comment ne pas les voir (il faut respecter tous ses lecteurs et les intérêts de chacun).

L’avantage de wordpress, même si c’est une usine à gaz, réside dans la panoplie d’outils disponibles. Nous allons donc voir comment utiliser en tant que lecteur les flux rss du célèbre moteur de blog.

Pour vous abonner à un site fonctionnant sous wordpress, c’est simple, il suffit d’ajouter /feed/ à la fin de l’url, par exemple pour ce blog  :

http://www.blog-des-telecoms.com/feed/

Vous recevrez ainsi tous les nouveaux articles dans votre lecteur de flux. Je profite pour vous conseiller Kriss Feed, qui est simple, très léger et performant.

Maintenant, je ne souhaite m’abonner qu’à une catégorie spécifique, par exemple la catégorie « voip ». Pour cela, je vais ajouter « /category/ » à la fin de mon url, suivi du nom de la catégorie « voip » suivi de « /feed », ce qui donne pour ce blog :

http://www.blog-des-telecoms.com/category/voip/feed

Il est possible de s’abonner aussi à un tag. Il faut remplacer « /category/ » par « /tag/ » !

Mais comment faire si je souhaite m’abonner à plusieurs catégories ou plusieurs tags ? encore une fois, c’est simple, on ajoute une nouvelle fois « /category/ » suivi du nom de la catégorie souhaitée. Imaginons, que je veux m’abonner à la fois à la catégorie voip et sdsl :

http://www.blog-des-telecoms.com/category/voip/category/sdsl/feed

C’est la même manipulation pour les tags.

Par contre, toutes les méthodes afin d’exclure une catégorie n’ont plus l’air de fonctionner ! Si vous savez comment faire, merci de poster la solution en commentaire.

Text to speech : comment utiliser festival, eSpeak et GoogleTTS avec asterisk, solution de téléphonie open source

Introduction

Il est souvent indispensable de diffuser des messages spécifiques aux appelants, des messages pouvant changer selon le contexte de l’appel (numéro appelé, numéro de compte saisi …). Il est difficile de prévoir tous les cas et d’enregistrer en studio à l’avance toutes les éventualités sans même parler du coût. Je vous propose d’utiliser un service de google permettant de générer un signal audio à partir d’un texte.

Nous allons voir dans cet article 3 moyens différents de réaliser de la synthèse vocale pour notre serveur asterisk.

Note : toutes les commandes sont pour une machine fonctionnant sous debian/ubuntu, mais vous pouvez simplement les transposer pour un autre système d’exploitation linux.

Qu’est-ce que le text to speech ?

Text to speech ou TTS pour les intimes, est une technique informatique permettant de transformer un texte écrit en parole artificielle, autrement dit, c’est de la synthèse vocale. Je vous renvoie sur wikipedia afin de découvrir l’histoire et les techniques de la synthèse vocale.

Il existe plusieurs solutions libres de synthèse vocale : Festival et eSpeak sont les 2 les plus connues fonctionnant sous linux. Nous allons voir l’installation et l’usage sous asterisk.

Une autre solution non libre, mais gratuite et qui à l’avantage de la simplicité : GoogleTTS. GoogleTTS est un service en ligne de Google (ah bon ?) réalisant de la synthèse vocale et qui est de plus, de bonne qualité.

Solution de synthèse vocale Festival

Installation

L’installation est très simple, le paquet étant disponible dans les repos de Debian et Ubuntu mais aussi de Centos.

apt-get install festival speech-tools

Ensuite, vous devez modifier le fichier festival.scm afin de permettre à asterisk de se connecter au serveur festival. Le fichier est situé dans le répertoire /usr/share/festival/

(define (tts_textasterisk string mode)
"(tts_textasterisk STRING MODE)
Apply tts to STRING. This function is specifically designed for
use in server mode so a single function call may synthesize the string.
This function name may be added to the server safe functions."
(let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string)))))
(utt.wave.resample wholeutt 8000)
(utt.wave.rescale wholeutt 5)
(utt.send.wave.client wholeutt)))

Ensuite, il faut démarrer le serveur festival avec la commande suivante :

festival --server 2>&1 > /dev/null &

Bine entendu, il est souhaitable de l’ajouter au fichier /etc/rc.local afin que le serveur festival soit lancé au démarrage de la machine.

Maintenant, nous devons paramétrer asterisk afin de lui indiquer où joindre notre serveur festival. Pour cela il faut modifier le fichier /etc/asterisk/festival.conf comme ci-dessous :

[general]
host=localhost
port=1314
;usecache=yes
;cachedir=/var/lib/asterisk/festivalcache/
festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n

Maintenant, nous allons vérifier que le module est bien chargé par asterisk en entrant cette commande en cli :

CLI> core show application festival

  -= Info about application 'Festival' =-

[Synopsis]
Say text to the user.

[Description]
Connect to Festival, send the argument, get back the waveform, play it to
the user, allowing any given interrupt keys to immediately terminate and return
the value, or 'any' to allow any number back (useful in dialplan).

[Syntax]
Festival(text[,intkeys])

[Arguments]
Not available

[See Also]
Not available

Si vous obtenez une sortie comme celle-ci , c’est parfait, sinon chargez le module manuellement :

CLI> module load app_festival.so

Utilisation

Nous allons maintenant le tester en modifiant le fichier /etc/asterisk/extensions.conf :

;Festival demo
exten => s, 1, Answer()
exten => s, n, Festival('Welcome! Your phone number is ${CALLERID(num)}.')
exten => s, n, Hangup()

Le résultat est acceptable sans être exceptionnel. Je ne vous ai pas présenté l’installation de la langue française, car la qualité n’est pas suffisante en regard des autres solutions que je vais présenter dans la suite de ce post. Mais comme festival est une solution open source nativement intégrée avec asterisk, il me semblait important de vous en parler.

Solution de synthèse vocale eSpeak

Installation

Tout d’abord, il faut installer les fichiers de développement d’asterisk. Ensuite, il est d’installer eSpeak. Pour nous simplifier la vie, nous allons utiliser les paquets, mais pour un serveur de production je vous encourage à installer eSpeak via les sources.

apt-get install espeak
apt-get install asterisk-espeak

L’installation via les paquets est maintenant terminée.

Utilisation

Nous allons voir l’utilisation de eSpeak au sein du dialplan asterisk. La commande à utiliser est Espeak et est assez simple à utiliser. Voici la syntaxe :

Espeak(text[,intkeys,language])

Le texte est entre guillemets, intkey peut prendre 2 valeurs, soit any, soit une des touches du téléphones et language la langue souhaitée. Voici un exemple :

;eSpeak Demo

exten => 1234,1,Answer()

;;Play mesage using default language as set in espeak.conf

exten => 1234,n,Espeak("This is a simple espeak test in english.",any)

;;Play message in Spanish

exten => 1234,n,Espeak("Esta es una simple prueba espeak en español.",any,es)

;;Play message in Greek

exten => 1234,n,Espeak("Αυτό είναι ένα απλό τέστ του espeak στα ελληνικά.",any,el)

;;Read a text file from disk (relative to the channel language)

;;and play it with espeak using the asterisk channel language.

exten => 1234,n,ReadFile(MYTEXT=/path/${LANGUAGE}/myfile,200)

exten => 1234,n,Espeak("${MYTEXY}",any,${LANGUAGE})

exten => 1234,n,Hangup()

Le logiciel est sous licence GPL, vous êtes donc libre de l’utiliser et bien entendu de l’améliorer.

Solution de synthèse vocale GoogleTTS

Installation

Afin d’utiliser GoogleTTS sur notre serveur asterisk, il est nécessaire que notre serveur ait un accès à internet (le script doit faire appel aux serveurs de Google) mais il nécessite aussi l’installation des paquets suivants :

apt-get install perl libwww-perl sox mpg123

Ensuite, nous allons utiliser un script AGI développer par Zaf, asterisk-googletts. Le script est développé en PERL.

Premièrement, localisez l’emplacement du dossier agi-bin afin d’y installer le script. Pour cela, vérifiez la variable astagidir dans le fichier asterisk.conf . Ensuite téléchargez le fichier googletts.agi dans ce répertoire :

wget https://raw.github.com/zaf/asterisk-googletts/master/googletts.agi
chmod +x googletts.agi

Maintenant, vous avez terminé l’installation !.

Utilisation

L’utilisation est extrêmement simple. Il suffit de faire un appel agi afin d’utiliser la synthèse vocale. Voici un exemple simple :

;DEMO GoogleTTS
exten => S,1,Answer()
exten => s,n,agi(googletts.agi,"Asterisk vous parle enfin.",fr)
exten => s,n,Hangup()

Un peu d’explication : googgletts.agi accepte plusieurs variables (4) que nous allons détailler :

  • La première contient le texte. L’exemple est parlant !
  • La seconde contient la langue qui doit être utilisée (par défaut en-US). La liste est très longue.
  • Les autres variables sont optionnelles :
    • 3ème variable : elle peut prendre soit la valeur « any » ou n’importe quel chiffre ou # ou * . Quand un de ces éléments est saisi par l’appelant sur son clavier téléphonique, la lecture du texte est arrêtée.
    • 4ème variable correspond à la vitesse de lecture (par défaut la valeur vaut 1). Vous pouvez accélérer la lecture en utilisant par exemple cette valeur 1.2 .

L’utilisation est assez simple et le résultat est convaincant. La communication avec les serveurs de Google se fait en clair, mais il est possible d’utiliser une connexion cryptée (pour cela, il faut modifier le script PERL.

Conclusion

Nous avons vu 3 solutions différentes afin de réaliser de la synthèse vocale sous asterisk. Sachez qu’il en existe d’autres gratuites ou payantes de différente qualité. A part festival dont la qualité me semble juste, eSpeak et GoogleTTS apporte une qualité suffisante pour la plus part des installations. Quelle solution utilisez-vous ?

Mistserver : installation sous Ubuntu

Mistserver est une solution opensource performante permettant de monter un serveur dédié de streaming développé par la société DDVTech B.V.

Nous allons l’installer sur un serveur ubuntu 14.04 LTS tout frais. Le process est simple.

Premièrement, télécharger les binaires :

wget https://releases.ddvtech.com/download.php?pack=mistserver_64&ver=2.1.3

Puis extraire les fichiers dans le répertoire /usr/local/bin, et enfin donner les droits suivants à MistController :

chmod a+x MistController

Maintenant pour lancer Mistserver, il suffit de saisir la commande ci-dessous en remplaçant username et password par vos valeurs. Ce sont ces éléments que vous devriez utiliser pour vous connecter à l’interface web :

MistController -a username:password -n

Et voilà, c’est fini, vous pouvez maintenant ouvrir votre navigateur web préféré (Firefox ou Opera 😉 ) et aller à l’adresse http://server-ip:4242

Je vous laisse découvrir la documentation complète afin de paramétrer dans le détail votre serveur de streaming. Je souhaite aussi attirer votre attention sur le fait que le projet à mis à disposition une image pour raspberry. Les performances sont très légères, mais pour faire des tests, ou pour un serveur de streaming personnel, une carte Raspberry fera très bien l’affaire avec Mistserver.

Asterisk : Comment configurer odbc pour stocker les cdr dans mysql

Procédure afin d’installer et configurer odbc pour un serveur linux debian afin d’y stocker nos précieux CDR.

Introduction

Tout d’abord nous allons supposer que les serveurs Asterisk et MySQL sont parfaitement installés et configurés (et sécurisés 🙂 ). Ce n’est pas l’objet de ce guide (Howto).

Installation d’ODBC

Nous allons commencer par installer les drivers ODBC nécessaires. Installer les paquets nécessaires pour le bon fonctionnement de ODBC et MySQL :

apt-get install unixodbc libmyodbc unixodbc iodbc

Maintenant, nous allons configurer odbc afin de se connecter à notre serveur MySQL.

Paramétrage de ODBC

Editer le fichier suivant /etc/odbcinst.ini, et copier les éléments suivants :

[MySQL]
Description = MySQL ODBC Driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout = 0
CPReuse = 0

Maintenant, il faut éditer /etc/odbc.ini et ajouter le code suivant :

[MySQL-asterisk]
Description = Connection to MySQL
Driver = MySQL
Socket = /var/run/mysqld/mysqld.sock
Server = localhost
User = YourUsername
Password = YourPassword
Database = YourDatabase
Option = 3

N’oublier pas d’adapter le User, Password et Database selon vos éléments, sinon vous obtiendrez une belle erreur !.

Création de la base de données CDR

Connectez vous à votre serveur MySQL et entrez le code suivant (attention aux espaces qui peuvent causer des erreurs)

CREATE TABLE cdr(calldate DATETIME NOT NULL,clid varchar(80) NOT NULL DEFAULT'aDefaultValue',src varchar(80) NOT NULL DEFAULT 'aDefaultValue',dstVARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dcontext VARCHAR(80) NOT NULLDEFAULT  'aDefaultValue',channel VARCHAR(80) NOT NULL DEFAULT 'aDefaultValue',dstchannel VARCHAR(80) NOT NULL DEFAULT'aDefaultValue',lastapp VARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',lastdataVARCHAR(80) NOT NULL DEFAULT  'aDefaultValue',duration int(11) NOT NULLDEFAULT '0',billsec int(11) NOT NULL DEFAULT '0',disposition VARCHAR(45) NOTNULL DEFAULT  'aDefaultValue',amaflags int(11) NOT NULL DEFAULT'0',accountcode VARCHAR(20) NOT NULL DEFAULT  'aDefaultValue',uniqueidVARCHAR(32) NOT NULL DEFAULT  'aDefaultValue',userfield VARCHAR(255) NOT NULLDEFAULT 'aDefaultValue');

GRANT ALL PRIVILEGES ON YourDatabase.* TO YourUsername@localhost IDENTIFIED BY 'YourPassword';

FLUSH PRIVILEGES;

Il faut tester le bon fonctionnement de notre connecteur ODBC avant d’aller plus loin. Entrez cette commande dans votre terminal :

isql -v MySQL-asterisk

Si tout fonctionne correctement, vous êtes connecté, sinon vous devriez voir un gentil message d’erreur 🙁 .

Paramétrage d’asterisk

Configuration d’ODBC

Nous allons commencer par paramétrer les fichiers de configuration d’Asterisk afin qu’il puisse utiliser ODBC afin de se connecter au serveur MySQL. Pour cela, nous allons éditer le fichier /etc/asterisk/res_odbc.conf et y ajouter :

[mysql]
enabled => yes
dsn => MySQL-asterisk
username => YourUsername
password => YourPassword
pre-connect => yes

puis, éditer le fichier /etc/asterisk/cdr_odbc.conf, et remplacer les lignes par celles-ci :

[global]
dsn=MySQL-asterisk
;username=asterisk
;password=asterisk
loguniqueid=yes
dispositionstring=yes
table=cdr ;"cdr" is default table name
usegmtime=no

Configuration de cdr.conf

Pour cela, nous allons éditer le fichier /etc/asterisk/cdr.conf et activer l’enregistrement des CDR dans une base de données via ODBC. Pour cela modifier au début du fichier :

enabled = yes

puis ajouter à la fin du fichier les lignes suivantes :

[odbc]
usegmtime=yes
loguniqueid=yes
loguserfiled=yes

Et maintenant redémarrer votre serveur Asterisk, connectez vous à la console et vérifier que le module res_odbc est bien chargé (reload res_odbc). faites de même avec le module cdr_odbc.

Puis faites un appel afin de vérifier que son CDR est bien dans la base de données.

Conclusion

Après avoir suivi attentivement ce guide, vous avez maintenant une installation Asterisk où vous pouvez enregistrer vos CDR via ODBC dans une base de données MySQL locale ou distante. Vous pouvez ainsi par exemple stocker les CDRs de vos serveurs Asterisk dans une base de données centralisées afin d’exploiter des données riches avec une application comme CDR-STATS, afin d’analyser vos appels et extraire de jolies stats pour les chefs.

 

NAS Synology OpenVPN : changer le port d’écoute par défaut

Les NAS Synology sont de très belles machines intégrant des fonctionnalités très intéressantes. Nous allons parler de la fonction serveur VPN, et notament OpenVPN.

Le serveur OpenVPN est intégré maintenant par défaut, il suffit donc de l’activer. Par contre, dans la configuration part défaut, il n’est pas possible de modifier le port d’écoute ni le protocole. Mais rassurez-vous, même si via l’interface web, on ne peut le faire, en cli c’est très facile.

Connectez vous en ssh sur votre NAS Synology, puis éditer à l’aide de vi le fichier de conf d’OpenVPN :

vi /usr/syno/etc/packages/VPNCenter/openvpn/openvpn.conf

et ajouter 2 lignes :

proto tcp
port 443

Ce qui vous donne le fichier de conf suivant :

push "route 192.168.1.0 255.255.255.0"
push "route 10.8.0.0 255.255.255.0"

dev tun
# les lignes à ajouter manuellement

port 443
proto tcp
management 127.0.0.1 1195
server 10.8.0.0 255.255.255.0
dh /var/packages/VPNCenter/target/etc/openvpn/keys/dh1024.pem
ca /var/packages/VPNCenter/target/etc/openvpn/keys/ca.crt
cert /var/packages/VPNCenter/target/etc/openvpn/keys/server.crt
key /var/packages/VPNCenter/target/etc/openvpn/keys/server.key
max-clients 3
persist-tun
persist-key
verb 3
#log-append /var/log/openvpn.log
keepalive 10 60
reneg-sec 0
plugin /var/packages/VPNCenter/target/lib/radiusplugin.so /var/packages/VPNCenter/target/etc/openvpn/radiusplugin.cnf
client-cert-not-required
username-as-common-name
duplicate-cn

Ensuite, vous redémarrer le serveur OpenVPN.

Vous pouvez maintenant vous connecter en VPN à votre NAS. Ah oui, petite précision, il faut modfier le fichier de configuration que vous exportez de l’interface web de votre Synology. Voici ce que vous devez obtenir :

dev tun
tls-client
### Ajouter votre adresse IP Publique et le port choisi - ici 443 
remote VOTRE_IP_PUBLIQUE 443 
proto tcp-client 
auth-nocache 
# The "float" tells OpenVPN to accept authenticated packets from any address, 
# not only the address which was specified in the --remote option. 
# This is useful when you are connecting to a peer which holds a dynamic address 
# such as a dial-in user or DHCP client. 
# (Please refer to the manual of OpenVPN for more information.) 
#float # If redirect-gateway is enabled, the client will redirect it's 
# default network gateway through the VPN. 
# It means the VPN connection will firstly connect to the VPN Server # and then to the internet. 
# (Please refer to the manual of OpenVPN for more information.)

#redirect-gateway # dhcp-option DNS: To set primary domain name server address. 

# Repeat this option to set secondary DNS server addresses. 

#dhcp-option DNS DNS_IP_ADDRESS 
pull script-security 2 
ca ca.crt 
comp-lzo 
reneg-sec 0 
auth-user-pass

Enjoy.

Install freeswitch compiled with odbc PostgreSQL on debian wheezy

This is my first howto in english.

As I will release in some days, my project name pyfreebilling (wholesale voip platefom based on Freeswitch, PostgeSQL and Django), i write the first installation step : howto compile and install freeswitch / odbc and postgresql on debian wheezy.

Prerequisites

You need to install these packages :

apt-get install git-core build-essential autoconf automake libtool libncurses5 libncurses5-dev gawk libjpeg-dev zlib1g-dev pkg-config libssl-dev libpq-dev unixodbc-dev odbc-postgresql postgresql postgresql-client

Configuration

You download freeswitch using git :

git clone git://git.freeswitch.org/freeswitch.git

go to the new freeswitch directory and start bootstrap :

./bootstrap.sh

and configure :

./configure

After, you need to edit modules.conf to selected required modules. For pyfreebilling, you need these modules :

applications/mod_commands
applications/mod_db
applications/mod_dptools
applications/mod_esf
applications/mod_esl
applications/mod_expr
applications/mod_fifo
applications/mod_fsv
applications/mod_hash
applications/mod_memcache
applications/mod_nibblebill
applications/mod_spandsp
codecs/mod_amr
codecs/mod_bv
codecs/mod_b64
codecs/mod_g723_1
codecs/mod_g729
codecs/mod_h26x
codecs/mod_vp8
codecs/mod_ilbc
codecs/mod_speex
dialplans/mod_dialplan_xml
endpoints/mod_loopback
endpoints/mod_sofia
event_handlers/mod_cdr_pg_csv
event_handlers/mod_event_socket
formats/mod_local_stream
formats/mod_native_file
formats/mod_sndfile
formats/mod_tone_stream
languages/mod_lua
languages/mod_spidermonkey
#languages/mod_yaml
loggers/mod_console
loggers/mod_logfile
loggers/mod_syslog
xml_int/mod_xml_rpc
xml_int/mod_xml_scgi

you also need to edit the Makefile of cdr_pg_csv module. The file si located here : src/mod/event_handlers/mod_cdr_pg_csv/Makefile . Copy and past the following code :

UNAME := $(shell uname -s)
ifeq ($(UNAME),SunOS)
ISA64 := $(shell isainfo -n)
LOCAL_CFLAGS=-I/usr/include/postgresql
ifneq (,$(findstring m64,$(CFLAGS)))
LOCAL_LDFLAGS=-L/usr/pgsql-9.1/lib/$(ISA64) -R/usr/pgsql-9.1/lib/$(ISA64) -lpq -static
else
LOCAL_LDFLAGS=-L/usr/pgsql-9.1/lib -R/usr/pgsql-9.1/lib -lpq -static
endif
else
LOCAL_CFLAGS=-I/usr/include/postgresql
LOCAL_LDFLAGS=-L/usr/pgsql-9.1/lib -lpq -static
endif
include ../../../../build/modmake.rules

Compilation & installation

Now, we are ready for make, so do :

make & make install

Now we need to create a freeswitch user :

adduser --disabled-password  --quiet --system --home /usr/local/freeswitch --gecos "FreeSWITCH Voice Platform" --ingroup daemon freeswitch
and to apply the rule to freeswitch user :
chown -R freeswitch:daemon /usr/local/freeswitch/ 
chmod -R o-rwx /usr/local/freeswitch/

Init script

and now, we need to create the init script to start and stop freeswitch :

nano /etc/init.d/freeswitch
#!/bin/bash
### BEGIN INIT INFO
# Provides:          freeswitch
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Freeswitch debian init script.
# Author:            Matthew Williams
#
### END INIT INFO
# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Freeswitch"
NAME=freeswitch
DAEMON=/usr/local/freeswitch/bin/$NAME
DAEMON_ARGS="-nc"
PIDFILE=/usr/local/freeswitch/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

FS_USER=freeswitch
FS_GROUP=freeswitch

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that sets ulimit values for the daemon
#
do_setlimits() {
        ulimit -c unlimited
        ulimit -d unlimited
        ulimit -f unlimited
        ulimit -i unlimited
        ulimit -n 999999
        ulimit -q unlimited
        ulimit -u unlimited
        ulimit -v unlimited
        ulimit -x unlimited
        ulimit -s 240
        ulimit -l unlimited
        return 0
}

#
# Function that starts the daemon/service
#
do_start()
{
    # Set user to run as
        if [ $FS_USER ] ; then
      DAEMON_ARGS="`echo $DAEMON_ARGS` -u $FS_USER"
        fi
    # Set group to run as
        if [ $FS_GROUP ] ; then
          DAEMON_ARGS="`echo $DAEMON_ARGS` -g $FS_GROUP"
        fi

        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null -- 
                || return 1
        do_setlimits
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background -- 
                $DAEMON_ARGS 
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
       ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

exit 0

mate this script executable :

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

And now ?

Enjoy !

But, don’t forget, you need to configure freeswitch and PostgreSQL (i will write an article explaining how to do)

Edito sécurité : attaques des systèmes téléphoniques (voip ou traditionnel)

Introduction

Les attaques informatiques se multiplient chaque jour. Mais certaines attaques ne font pas les gros titres des journaux, mais par contre coûtent cher. Ces attaques ont pour but de détourner le système téléphonique (PABX ou IPBX) de l’entreprise afin d’émettre des appels frauduleux vers des pays où les communications sont onéreuses. Cette activité est très lucrative. Certains opérateurs ont eux même eu la désagréable surprise un matin, de découvrir un volume d’appels très important anormal vers des destinations exotiques.

Il faut avoir en tête qu’une grande partie de ces attaques sont basées sur des failles connues. Ces mêmes attaques ne sont pas très complexes à mettre en oeuvre et ne prennent que peu de temps. Une autre partie des attaques se base sur la négligence des administrateurs des systèmes téléphoniques.

Donc oui, les attaques sur les systèmes de téléphonie sont en effet de plus en plus courant. 01net y a consacré un article le 15 mars dernier, que vous pouvez relire ICI .

Pourquoi ces attaques ?

Il est d’autant plus facile d’attaquer une grande partie des systèmes installés et ceci en grande partie à cause de la légèreté des décideurs et des intégrateurs. En effet, le premier est responsable du choix du système et de son prestataire. Il se doit aussi de vérifier quelles sont les prestations inclues dans son contrat de maintenance. En effet, les mises à jour sont des opérations qui prennent du temps et qui sont très souvent liées à l’achat de licences logicielles et hors contrat de maintenance. On parle sinon de contrat d’infogérance.
Le deuxième pêche souvent par le manque de compétences de base liées à la sécurité et le manque d’informations diffusées à son client (combien d’intégrateurs ont averti leurs clients de la nécessité de faire une mise à jour de leur système Alcatel suite à la découverte d’une faille de sécurité liée à la messagerie vocale ?).

Ces attaques sont-elles évitables ?

Ces attaques simples (et il y en a plusieurs) révèlent aussi un autre point inquiétant : le manque ou la baisse de compétences en général. Notre monde se tourne vers le lowcost, et seul le prix devient un élément de décision. Quand un stagiaire est responsable d’un déploiement ou d’une prestation, on est en droit de se poser des questions (un stagiaire n’est-il pas là pour apprendre ?).
Lors des déploiements, le volet sécurité n’est que très rarement pris en compte voir complètement occulté. Les mots de passe des systèmes ne sont pas modifiés, les utilisateurs ont le même mot de passe trivial d’accès à leurs ressources téléphoniques et on laisse aux VIP tous les droits

Resources complémentaires

J’ai écrit une liste d’articles sur ce sujet qui est en effet de plus en plus d’actualités. Les attaques sont maintenant organisées et automatisées. L’erreur serait de croire que vous êtes à l’abri (même de gros opérateurs se sont fait hacker).
http://www.blog-des-telecoms.com/votre-systeme-telephonique-est-il-bien-protege
http://www.blog-des-telecoms.com/securiser-votre-systeme-de-telephonie-pabx-ipbx
http://www.blog-des-telecoms.com/vulnerabilite-de-la-voip
http://www.blog-des-telecoms.com/comment-securiser-le-sip-d-un-serveur-asterisk
Je vous souhaite une bonne lecture, en espèrant que cette édito en ce jeudi matin puisse éviter à certaines entreprises des réveils douloureux en ces temps difficiles.