[revue de presse] Asterisk présenté dans Linux Magazine Avril 2014

Ce mois-ci vous découvrirez un article présentant Asterisk. N’ayant pas encore reçu mon magazine, je ne vous donnerais donc pas d’avis. Mais, si cet article est dans ce magazine, c’est qu’il est de bon niveau. Je vous ferais un retour après lecture. Un autre article qui me tente concerne la planificateur de requête de PostgreSQL. Et hop, un copié-collé du sommaire.

News
p.04 Inside Android : Jelly Bean (4.1 à 4.3)
Sysadmin
p.16 Planificateur de requêtes de PostgreSQL – Les parcours
En couverture
p.28 Asterisk en routeur d’appels : Par Toutatis, ça capte mal dans ce tunnel !
Repères
p.38 Retour d’expérience sur l’optimisation d’un projet libre
p.48 La documentation de code ne sert à rien !
Netadmin
p.50 Collectd et PerfWatcher : découverte
p.56 Collectd et PerfWatcher : installation
p.66 Graphing, logging et monitoring 2.0 : vos alertes avec Sensu
Code(s)
p.80 YAML et Python

Pourquoi PyFreeBilling est un logiciel libre ?

Comment fonctionne le logiciel libre ? vous y trouverez les raisons de mon choix de la licence GPL pour PyFreeBilling.

On me pose souvent la question, pourquoi avoir choisi une licence libre pour PyFreeBilling. Pour rappel, PyFreeBilling est un logiciel permettant à un opérateur VoIP d’acheter et de revendre des minutes téléphoniques (et vidéo) s’appuyant sur le moteur Freeswitch.

Etant adhérant à l’APRIL, j’ai découvert une plaquette parfaitement réalisée expliquant précisément les raisons de mon choix.

comment marche logiciel libre

 

IPBX : sortie de Astlinux 1.14, plateforme de communication sécurisée embarquée

Découvrez les détails de cette nouvelle version qu’il faut absolument découvrir

Cette nuit, une nouvelle version de Astlinux vient de sortir. Astlinux est une distribution intégrant Asterisk, et l’ensemble des outils nécessaires afin de gérer votre PABX. Il est plutôt destiné aux petites entreprises du fait de son interface simple. Mais un administrateur connaissant asterisk ne sera nullement bridé et pourra pousser asterisk dans ses retranchements.

Présentation de Astlinux

Astlinux se différencie de ses concurrents Trixbox, Xivo, Elastix par le fait qu’il est optimisé pour fonctionner sur des environnements avec peu de ressources. Je l’ai utilisé pendant des années sur des cartes Soekris. On obtient un système solide : pas de disque dur (on utilise une carte mémoire et le stockage de la prog et des messages se font sur une clé usb ou un disque flash par exemple), pas de ventilateur et une faible consommation (il est facile de tenir de nombreuses heures avec une petite batterie).

Fonctionnalités

AstLinux fournit une plateforme de communication sécurisée intégrant les éléments suivant :

  • Asterisk 1.8 and 11: SIP, DAHDI – IPBX
  • Asterisk Operator Panel: FOP2 – optional Add-On Package
  • Prosody 0.9: XMPP – Presence et Message
  • Linux: Kernel 2.6.35, basé sur Busybox avec iproute2, e2fsprogs et util-linux
  • VPN : OpenVPN IPSec VPN and PPTP
  • Languages: bash, php, lua and perl
  • Server web: Linux-Lighttpd-SQLite3-PHP
  • Monitoring: Zabbix SNMP et UPS Equipment
  • Routeur IPv4 / IPv6 et Stateful Filtering Firewall
  • Serveurs DHCP, DNS, TFTP NTP et FTP
  • Notifications par email
  • Serveur LDAP pour distribuer l’annuaire
  • ODBC afin de supporter SQLite3
  • RUNNIX bootloader permettant la gestion des versions de firmware et les diagnostiques matériels
  • Interface pour l’administration

Nouveautés

Cette nouvelle version apporte l’intégration d’un serveur d’annuaire LDAP permettant de distribuer l’annuaire, la’intégration du paquet Nut pour la supervision de l’UPS et quelques correctifs de bugs et de failles de sécurité.

Conclusion

Attention, Astlinux n’est pas un clicodrome. Il faut donc savoir ce que l’on fait quand on souhaite l’utiliser. Des notions de Linux, d’Asterisk, de réseau et de VPN (si vous souhaitez l’utiliser, mais c’est tout de même recommandé pour les postes distants) sont indispensables.

Vous trouverez sur le site de Astlinux les images afin de pouvoir l’utiliser ou le tester sur VirtuialBox ou VMWare (mais dans ces 2 derniers cas, pas en prod !!!).

L’image pour la carte 5501 de Soekris est bien entendu disponible. Si vous avez dans vos placard quelques cartes 4801, il est possible de créer votre propre image assez simplement.

PyFreeBilling : new UI

I proud to annonce the release of the new UI. I take care of users and customers remarks and you will find now a more friendly menu and nice UI : less clicks, better looking, quicker menu.

Check on bitbucket the last sources.

Some captures :

New customer menu.

pyfreebilling customer detail

Customer detail view, with left nav.

Pyfreebilling customer rates

And customer rates.

Have a nice day.

Matt

PyFreeBilling : présentation du softswitch basé sur Freeswitch dédié au wholesale

PyFreeBilling est une solution Open Source de billing et de softswitch dédiée à une activité d’opérateur wholesale VoIP. Cette solution est basée sur Freeswitch, postgresql et python. Ces fonctionnalités sont complètes. PyFreeBilling a été développé avec un objectif de montée en charge (il est actuellement utilisé notament pour terminer les appels des call centers).

Introduction

Il est extrêmement difficile de trouver des solutions Open Source permettant de monter une infrastructure permettant de vendre des communications VoIP, de gérer la facturation (billing) avec une contrainte de montée en charge importante. beaucoup de petits opérateurs utilisent a2billing, mais malgré la qualité du projet, son utilisation est différente : il a été développé pour gérer les cartes d’appels (calling cards).

Explication des choix techniques

Je souhaitais utiliser Freeswitch comme switch VoIP pour ces nombreuses qualités :

  • performance et stabilité assurant une bonne montée en charge
  • performance de la stack SIP (stack Sofia développée par Nokia)
  • utilisation du langage LUA pour les scripts
  • applications performantes
  • fonctions de débuggage évoluées

Ensuite, naturellement la base de données choisie a été PostgreSQL. Je ne vais pas faire un article complet sur ce choix, mais il est important. PostgreSQL est un moteur de base de données performant et fiable, deux qualités indispensables pour cette application.

Enfin, la gestion doit s’effectuer via une interface web, et pour cela le langage python a été choisi : performance, lisibilité … et puis j’aime bien ce langage (c’est important, non ?). Bien entendu, le choix d’un framework comme Django c’est imposé, car il apporte un ensemble de fonctionnalités indispensables (cadre de développement, ORM, sécurité, applications …).

Fonctionnalités

PyFreeBilling intégre un ensemble de fonctionnalités nécessaires à une activité de vente de minutes VoIP :

  • Customer add/modify/delete
  • IP termination
  • SIP authentication
  • Prepaid and/or postpaid
  • Realtime billing
  • Block calls on negative balance (prepaid) or balance under credit limit (postpaid)
  • Block / allow negative margin calls
  • Email alerts
  • Daily balance email to customer
  • Limit the maximum number of calls per customer and/or per gateway
  • Multiple contexts
  • Tons of media handling options
  • Powerfull ratecard engine
  • Provider add/modify/delete
  • Powerful LCR engine
  • Routing based on area code
  • Routing decision based on quality, reliability, cost or load balancing (equal)
  • Limit max channels by each provider gateway
  • Extensive call and financial reporting screens (TBD)
  • CDR export to CSV
  • Design for scalability

Interface web

Toute la gestion s’effectue via l’interface web.

D’autres copies d’écran sont disponibles sur le repo, n’hésitez pas à y aller. Elles ont été créées par ordre de programmation :

  • ajoût d’un client
  • ajoût d’un compte SIP client
  • création d’une grille tarifaire et d’un tarif
  • affectation d’une grille tarifaire à un compte client
  • ajoût d’argent à la balance d’un client
  • création d’une grille tarifaire fournisseur et d’un tarif
  • création d’une LCR (définition du routage d’un appel – très important, c’est le lien entre une grille de vente client et une grille d’achat fournisseur)
  • création d’une gateway fournisseur

Documentation

La documentation est disponible sur readthedocs. La doc utilisateur sera enrichie au fil de l’eau, il me reste encore un peu de travail de rédaction.

Où est le code

Le code est hébergé sur Bitbucket.

Support

Vous pouvez ouvrir vos demandes de support (bug, amélioration, remarque constructive …) sur bitbucket, qui fournit un bel outil de gestion des « issues ».

Et maintenant ?

Je vais bientôt sortir la v1.2. Pour cela, je finis les tests sur un script de déploiement afin de simplifier cette tâche ainsi qu’une intégration dans l’interface web de quelques commandes cli de Freeswitch pour les allegriques de la ligne de commande.

J’ai plein d’idées pour la V2, comme l’intégration de la gestion multi devises, d’émission des factures, de gestion des abonnements et de gestion des appels entrants (DID ou SDA).

N’hésitez pas à commenter, émettre des suggestions, j’attache beaucoup d’importante aux retours.

PyFreeBilling : wholesale billing application documentation

You will find the documentation here : http://pyfreebilling.readthedocs.org/en/latest/index.html

It will update as new functionnalities will be added or new version released.

PyFreeBilling is a open source wholesale billing application based on Freeswitch.

PyFreeBilling : migration to bitbucket

I recently decided to migrate the PyFreeBilling project (wholesale softwitch based on freeswitch) from Github to Bitbucket. The new address is https://bitbucket.org/mwolff/pyfreebilling

Why ? because i like BitBucket and overall the tools for managing issues. I used extensively for my other projects.

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.

Asterisk : comment lire un numéro de téléphone à l’appelant

Nous allons voir comment asterisk peut annoncer un numéro de téléphone à l’appelant. En France, on ne lit un numéro de téléphone en annonçant chaque nombre le composant, mais par groupe de 2 ( 014012… est lu zero un, quarante, douze … et non zero, un, quatre, zero, un , deux …). Pour cela nous allons utiliser l’application app_playpack.so.

Fonctionnement

L’application app_playback.so se paramètre dans le fichier de configuration say.conf. L’application utilisée afin de lire le numéro est Playback().

Pré requis

Il faut s’assurer que dans sip.conf, dans la section [general] que vous ayez la définition suivante :

language=fr

Ensuite, éditez asterisk.conf et ajoutez dans le context [options] et ajouter :

languageprefix = yes

Les fichiers de voix française sont bien entendu installés.

Ensuite, vous devez avoir le fichier say.conf dans /etc/asterisk et ce fichier doit contenir les patterns pour le français.

Configuration

Modifiez say.conf afin d’avoir les lignes suivantes :

[fr](date-base,digit-base)
_[n]um:0X => num:${SAY:0:1}, num:${SAY:1:1}

...

;numeros 0800 : 0800, 0811... 0899
_pho[n]e:08XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:3},num:${SAY:4:2}, num:${SAY:6:2},num:${SAY:8:2}

;numeros de telephones fixes et mobiles
_pho[n]e:0[1-79]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}

Ensuite, faites un reload ( ou juste « module reload app_playback.so ») afin de prendre en compte les changements.

Un exemple d’utilisation

Voici un exemple de code à ajouter dans un contexte du fichier extensions.conf :

[pres-num-tel-fr]
exten => 0011,1,Playback(phone:0140456789,say)
exten => 0011,n,Hangup

ou si vous souhaitez utiliser votre AGI en utilisant le PERL :

$AGI->exec("PLAYBACK num:0140456789,say ""n");

Voilà votre asterisk programmé afin d’énoncer à la manière française les numéros de téléphone.