Translate

2008-07-31

Un petit script de synchronisation de repertoires

Ma problématique était plus ou moins simple, permettre a deux serveurs de synchroniser certains répertoires entre eux (un serveur de production et un serveur de backup, le but étant de répercuter toutes les créations et modifications de fichiers sur le serveur de backup)
Donc en fait ce petit script quotidien est simple, il scanne les répertoires que l'on souhaite synchroniser, y détecte les modifications/créations ayant eu lieu dans la journée, crée une archive avec et un fichier de script a exécuter sur le serveur de backup ce qui répercute les modifications.Les transferts ont lieu par ftp:
Voici le code source;

modifs_du_jour.sh ; le script a exécuter tous les jours (dans le cron) sur le serveur de production:

#! /bin/sh
# SL 2008-07-21 Script de synchronisation des repertoires entre la prod et le backup
fichiermodifs=`date +%Y%m%d`'_modifs.sh'
fichiermodifsgz='modifsjour'`date +%Y%m%d`'.tar.gz'
#coordonnees ftp du serveur cible
serveurftp='XXXXXXXXXXX'
userftp='XXXX'
mdpftp='XXXX'
#effacement des modifs de la veille
rm -f -R /db/modifsjour/*
#boucle sur chacun des repertoires que l'on veut synchroniser
for chemin in "/usr/local/scripts/" "/usr/local/apache2/htdocs/" "/bin/*.sh" "/db/factures*" "/db/relancesPDF/" "/db/Archivage/" "/db/contentieux/" "/db/contentieux/" "/db/courriersPDF/" "/db/courriersPDF/" "/db/CR_SiegesPDF/" "/db/tickets/"
do
echo "Traitement de : "$chemin
#creation d'une ligne dans le script qui s'executera sur le serveur de backup avec tous les
#fichiers modifies dans la journee
find $chemin -name "*.*" -mtime 0 | awk 'BEGIN{FS="/"}{print "/bin/sh /bin/repcp.sh \"" $NF "\" \""$0"\""}' >> /db/modifsjour/$fichiermodifs
#copie dans un repertoire de tous les fichiers modifies dans la journee
find $chemin -name "*.*" -mtime 0 | awk '{print "cp \"" $0 "\" /db/modifsjour/"}'|sh
done
cd /db/
#creation de l'archive
tar -cvzf $fichiermodifsgz /db/modifsjour/
#transfert ftp vers le serveur de backup
/usr/bin/ftp -nv $serveurftp < <SCRIPT
quote USER $userftp
quote PASS $mdpftp
binary
prompt
cd modifs
mdelete *.gz
put $fichiermodifsgz
prompt
quit
SCRIPT
rm /db/$fichiermodifsgz

Il reste ensuite a exécuter sur le serveur de backup le script `date +%Y%m%d`'_modifs.sh' qui reconstitue les modifications a partir de l'archive 'modifsjour'`date +%Y%m%d`'.tar.gz'.
Il faut également le code source de repcp.sh qui est une copie récursive qui crée les répertoires si ils n'existent pas (très utile dans le cas de répertoires crées sur le serveur de production).

repcp.sh:

#! /bin/sh
cd /home/ilan/modifs/db/modifsjour/
source="$1"
target="$2"

if [ ! -d `dirname "$target"` ]
then
mkdir -m 755 -p $(dirname "$target")
fi
cp -Rfp "$source" "$target"
exit 0

en espérant vous avoir été utile et en implorant votre indulgence sur les scripts, c'est vraiment pas le langage que j'apprécie!

2008-07-23

Asterisk 1.4 a bannir pour la production

Juste un petit billet pour largement vous encourager a rester sous Asterisk 1.2.x (et les zaptel libpri qui vont avec) et éviter le 1.4.
Ça fait trois ou quatre fois que j'essaie de passer mes serveurs de production sous 1.4.x (au fur et a mesure de la sortie des nouvelles versions stables) et a chaque fois une merde ; coupures,plantages bref la totale , tout disparaît des que je repasse en version 1.2.x.

2008-07-17

Ma rencontre avec A2billing la plateforme de cartes prepayees et postpayees d'Asterisk

Le Contexte

Heureux administrateur d'une dizaine de serveurs Asterisk, je me suis vu confier un projet de gestion de comptes prépayés couplé avec notre IPBX Open Source favori.
La configuration étant simple
a priori , le client reçoit le numéro de téléphone du serveur, un code d'accès (ou reconnaissance de son numero appelant) et il peut composer et communiquer dans la limite du crédit lui restant.

La perte de temps idiote

Je me dit dans un premier temps que ça doit être faisable "maison" avec un petit script agi qui va taper dans une base de données pour identifier l'appelant (soit par un code tape soit par son CID) et qui lance la commande Dial qui va bien si il est authentifié (avec une limite de temps maximale correspondant a un calcul basé sur le coût de l'appel et son crédit restant).Une fois l'appel terminé une petite décrémentation de son crédit restant epicetou.
En fait j'y a ai pass
é deux jours et c'etait pas si trivial, je me suis meme carrément fait chier avec plein de petits détails galère.

Eureka

Je me dirige alors vers la recherche d'outils Open Source gérant cela (je sais j'ai fait les choses a l'envers faites pas chier, c'est ma fierté mal placée) franchement pas convaincu de trouver un truc pareil en libre.
Je commence donc a arpenter le wiki de voip-info et a essayer divers trucs plus ou moins réussis, plus ou moins payants, plus ou moins ininstallables.
Et la je tombe sur A2biling ,LE TRUC DE LA MORT QUI TUE SA RACE, le produit PHP/MySQL qui gere non seulement tout ce que je cherche mais meme dix fois plus (prépayé,postpayé,identification par CID,recharge de cartes...)!



Apres 3 saltos arriere, une danse du ventre et 1/4 d'heure d'installation sans encombres (franchement génial le wiki http://wiki.asterisk2billing.org/index.php/Installation_guide , je n'ai fait que le suivre a la lettre ) le truc est direct opérationnel et la c'est franchement la folie au niveau de l'ergonomie et de la simplicité de mise en route.

  • Tu crées tes utilisateurs (cartes) qui sont authentifiés soit par leur CID soit par un code a taper.
  • Tu crées tes cartes prepayées, tout est paramétrable.
  • Tu crées tes offres
  • Tu sors des stats, des factures ...
  • Bref une multitude de fonctionnalités (dont je suis loin d'avoir faite le tour tellement c'est vaste)
Vous avez compris je suis fan de a2billing et je vous encourage vivement a aller le tester

http://www.asterisk2billing.org/cgi-bin/trac.cgi

2008-07-02

Mes sources d'informations Asterisk

A tout seigneur tout honneur , je me dois de remercier les sources qui me permettent d'avancer avec Asterisk depuis mes premiers pas (3 ans déjà!)

L'incontournable voip-info avec son wiki, bible d'Asterisk
Astrecipes , très sympa aussi
Asterisk France
Asterisk guru
Le topic Asterisk d'HFR
Site Officiel

Sans oublier le lien vers LE DOCUMENT DE RÉFÉRENCE sur Asterisk
Asterisk, the future of Telephony@O'Reilly

Petit script en php utilisant le manager Asterisk pour lancer un appel

Script établissant une communication entre deux extensions

if($_POST['lancer'])

{

$appelle=$_POST['extension'];

$appelant=$_POST['sipuser'];

echo "$appelant vous allez être en communication avec le ".$appelle;

// connexion au manager

$socket = fsockopen("xxxxxx","5038", $errno, $errstr);

fputs($socket, "Action: Login\r\n");

fputs($socket, "UserName: superuser\r\n");

fputs($socket, "Secret: xxxxxx\r\n\r\n");

fgets($socket);

// lancement de l'appel

fputs($socket, "Action: Originate\r\n");

fputs($socket, "Exten: $appelle\r\n");

fputs($socket, "Context: yyyyyyy\r\n");

fputs($socket, "CallerID: $appelle\r\n");

fputs($socket, "Priority: 1\r\n");

fputs($socket, "Channel: SIP/$appelant\r\n\r\n");

fputs($socket, "Action: Logoff\r\n");

}

Commander Asterisk avec des fichiers .call

L'utilisation des fichiers .call avec Asterisk


Il existe une autre manière de lancer des applications avec Asterisk, l’utilisation de fichiers .call.

En déposant dans le répertoire /var/spool/asterisk/outgoing des fichiers correctement formatés, il est possible de déclencher des applications d’Asterisk, qui scanne continuellement ce répertoire.

Exemple 1 : Envoi de SMS via un fichier call

Envoie un SMS au yyyyyyyyy en utilisant la passerelle de bezeq (14974800), nécessite un contexte [smsdial] (voir extensions.conf)

Channel: ZAP/g1/14974800

MaxRetries: 1

RetryTime: 60

WaitTime: 30

Context: smsdial

Extension: yyyyyyyyy

Priority: 1

SetVar: MSG=Test SMS coucou

Il est également possible d’utiliser le programme smsq en ligne de commande pour envoyer un SMS ;

smsq --motx-channel= numero_du_centre sur le channel numero_du_destinanataire "test"

Exemple 2 : Envoi de FAX via un fichier call

Envoie le document stocke dans /var/spool/asterisk/fax/1179405466.6.tif en fax au numéro XXXXXXX

Channel:ZAP/g1/XXXXXX

MaxRetries: 1

WaitTime: 20

Application:txfax

Data:/var/spool/asterisk/fax/1179405466.6.tif|caller

Script , capable de générer des fichier call creeficcall :

#!/bin/sh

# SL 20/05/2007 SCRIPT d'envoi de fax/sms

# cree dans le repertoire outgoing un fichier .call executant l'operation

CONCENTRATEUR_SMS=14974800

CHEMIN_FICHIER_CALL="/var/spool/asterisk/outgoing/"

POOL_FAX="/var/spool/asterisk/fax/"

typemessage=$1

destinataire=$2

corps=$3

if [ $1 = 'SMS' ]

then

echo "Channel: ZAP/g1/"$CONCENTRATEUR_SMS"

MaxRetries: 1

RetryTime: 60

WaitTime: 30

Context: smsdial

Extension: "$2"

Priority: 1

SetVar: MSG="$3 > $CHEMIN_FICHIER_CALL$1"_"$2".call"

fi

if [ $1 = 'FAX' ]

then

echo "Channel: ZAP/g1/"$2"

MaxRetries: 1

WaitTime: 20

Application:txfax

Data:"$POOL_FAX$3"|caller" > $CHEMIN_FICHIER_CALL$1"_"$2".call"

fi

if [ $1 = 'VOICEMAIL' ]

then

echo "Channel: SIP/"$2"

MaxRetries: 1

WaitTime: 20

Set:CHANNEL(language)=fr

Application:VoiceMailMain

Data:"$3 > $CHEMIN_FICHIER_CALL$1"_"$2".call"

fi

Script de montee de fiche CRM avec Asterisk

Voici le code en C# d'un petit module que j'ai écrit , qui se connecte au manager d'Asterisk détecte si l'agent présent sur la machine a répondu a un appel et lance un url en conséquence.
Très utile pour faire monter une fiche client lors d'un appel entrant.
Telechargement : http://rapidshare.com/files/126553896/montee_fiche.rar.html

Code Source:

Le fichier config.xml



Mainform.cs

/*
* SAMUEL LEVY
* Date: 21/01/2007
* Time: 11:23
* monte_fiche.cs
* Script de montee de fiche
* Il recupere l'evenement Link du manager d'Asterisk, recupere le numero de
* l'appel entrant puis lans ce browser pour ouvrir la fiche correspondante
*/
using System.Net;
using System.Xml;
using System.Net.Sockets;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Win32;

namespace monte_fiche
{

// SL 21/01/2007
// Classe de connexion au manager d'asterisk
// Gere la reception d'evenements tels les appels entrants
// Permet l'ouverture de la fiche associee au numero entrant
class manager_access
{
private string IPadress;
private int port;
private string utilisateur;
private string password;
private string sipuser;
private string scriptmontee;
private Socket MyAstSocket;
private IPEndPoint MyAstServerEndPoint;

//constructeur par defaut
public manager_access()
{
this.IPadress="";
this.port=0;
this.utilisateur="";
this.password="";
this.sipuser="";
this.scriptmontee="";
}

//constructeur
public manager_access(string t_server,int t_port,string t_utilisateur,
string t_password,string t_sipuser,string t_scriptmontee)
{
this.IPadress=t_server;
this.port=t_port;
this.utilisateur=t_utilisateur;
this.password=t_password;
this.sipuser=t_sipuser;
this.scriptmontee=t_scriptmontee;
}

//constructeur a partir du fichier XML
public manager_access(XmlTextReader FileConf)
{
FileConf.WhitespaceHandling=WhitespaceHandling.None;

//parsing du fichier de conf et ecriture dans les variables de la classe
while(FileConf.Read())
{

if(FileConf.LocalName=="serveur")
{
this.IPadress = FileConf.ReadString();
FileConf.Read();
this.port = Convert.ToInt32(FileConf.ReadString());
FileConf.Read();
this.utilisateur = FileConf.ReadString();
FileConf.Read();
this.password = FileConf.ReadString();
FileConf.Read();
this.scriptmontee = FileConf.ReadString();
FileConf.Read();
this.sipuser = FileConf.ReadString();
}
}
FileConf.Close();

//recuperation de l'user xlite de la machine
//this.sipuser = Recupere_User_Xlite();
}

~manager_access()
{
MyAstSocket.Close();
}

private string[] SplitByString(string testString, string split) {
int offset = 0;
int index = 0;
int[] offsets = new int[testString.Length + 1];

while(index < testString.Length) {
int indexOf = testString.IndexOf(split, index);
if ( indexOf != -1 ) {
offsets[offset++] = indexOf;
index = (indexOf + split.Length);
} else {
index = testString.Length;
}
}

string[] final = new string[offset+1];
if (offset == 0 ) {
final[0] = testString;
} else {
offset--;
final[0] = testString.Substring(0, offsets[0]);
for(int i = 0; i < offset; i++) {
final[i + 1] = testString.Substring(offsets[i] + split.Length, offsets[i+1] - offsets[i] - split.Length);
}
final[offset + 1] = testString.Substring(offsets[offset] + split.Length);
}
return final;
}

private string Recupere_User_Xlite()
{
//recupere dans la base de registre le nom du user X-Lite en cours
RegistryKey rk = Registry.CurrentUser;
RegistryKey rk2 = rk.OpenSubKey("Software\\CounterPathSolutionsInc\\X-Lite");
return rk2.GetValue("general:Username").ToString();
}
//Fonction de connexion au socket pour dialoguer avec le manager Asterisk
public void Ast_Connecte()
{
this.MyAstSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.MyAstServerEndPoint = new IPEndPoint(IPAddress.Parse(this.IPadress), this.port);
MyAstSocket.Connect(this.MyAstServerEndPoint);

}

//Cette fonction se logue au manager Asterisk et attend un evenement Link
// Si link cela veut dire qu'une communication est etablie pour le user
// on recupere alors le numero et l'on ouvre le browser sur la fiche correspondante
public void Ast_Logue_Et_Ecoute()
{
// Se logue
this.MyAstSocket.Send(Encoding.ASCII.GetBytes("Action: Login\r\nUsername: "+this.utilisateur+"\r\nSecret: "+this.password+"\r\nActionID: 1\r\n\r\n"));
int bytesRead = 0;
char[] delimiterChars = { ' ', '\n' };
string delimiterChars2 = "\r\n\r\n";
do
{
int affiche = 0;
byte[] buffer = new byte[1024];
bytesRead = this.MyAstSocket.Receive(buffer);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

string[] blocs = SplitByString(response,delimiterChars2);
//string[] blocs = response.Split(delimiterChars2);
foreach(string bloc in blocs)
{
string[] reponseclatees = bloc.Split(delimiterChars);

if(Regex.Match(bloc, sipuser, RegexOptions.IgnoreCase).Success
&& Regex.Match(bloc, "Link", RegexOptions.IgnoreCase).Success
&& !Regex.Match(bloc, "UnLink", RegexOptions.IgnoreCase).Success
&& !(Regex.Match(bloc, "Channel2: SIP", RegexOptions.IgnoreCase).Success
&& Regex.Match(bloc, "Channel1: SIP", RegexOptions.IgnoreCase).Success
)
)
{
foreach(string s in reponseclatees)
{
if(affiche == 1)
{
//Si appel entrants lance le browser
if(!Regex.Match(s, sipuser, RegexOptions.IgnoreCase).Success)
{
affiche = 0;
//Lancement du browser et de la fiche
System.Diagnostics.Process.Start(scriptmontee+s);
affiche = 0;
// reponseclatees = null;
// break;
}
//appel sortant ne lance pas le browser
else
{
affiche = 0;
}
}
if(Regex.Match(s, "CallerID1:", RegexOptions.IgnoreCase).Success)
//if(Regex.Match(s, "CallerID2:", RegexOptions.IgnoreCase).Success)
//if(Regex.Match(s, "Channel2:", RegexOptions.IgnoreCase).Success)
{
affiche = 1;
}
else
{
affiche = 0;
}
}
}

if(Regex.Match(bloc, "Message: Authentication accepted", RegexOptions.IgnoreCase).Success)
{
// Send a ping request the asterisk server will send back a pong response.
this.MyAstSocket.Send(Encoding.ASCII.GetBytes("Action: Events\r\nEventMask: ON\r\n\r\n"));
}
}
}while(bytesRead != 0);
}

//accesseurs
public string a_serveur
{
get
{
return this.IPadress;
}
set
{
this.IPadress = value;
}
}
public int a_port
{
get
{
return this.port;
}
set
{
this.port = value;
}
}

public string a_utilisateur
{
get
{
return this.utilisateur;
}
set
{
this.utilisateur = value;
}
}

public string a_password
{
get
{
return this.password;
}
set
{
this.password = value;
}
}

public string a_sipuser
{
get
{
return this.sipuser;
}
set
{
this.sipuser = value;
}
}

public string a_scriptmontee
{
get
{
return this.scriptmontee;
}
set
{
this.scriptmontee = value;
}
}
//Fin accesseurs

}//Fin Classe manager_access



public partial class MainForm
{
[STAThread]
public static void Main(string[] args)
{
Application.Run(new MainForm());
}

public MainForm()
{
//this.Show();
//this.Hide();
this.Activate();

string configuration_file = "C:\\Program Files\\montee_fiche\\config.xml";
//InitializeComponent();

//lecture de la configuration
XmlTextReader filexml=new XmlTextReader(configuration_file);

//cree une instance de connexion au Manager Asterisk grace au fichier de conf
manager_access MyManager = new manager_access(filexml);

// Se connecte au manager.
MyManager.Ast_Connecte();

// Se met en position d'attente d'evenements du manager
MyManager.Ast_Logue_Et_Ecoute();


}
}
}



Pour fonctionner , ce script doit être compile et installe avec le fichier de config dans C:\Program Files\montee_fiche\.
Il necessite .NET.

2008-07-01

Fichiers de configuration d'Asterisk

Description des fichiers de configuration

Une fois les binaires compilés et installés, il faut correctement configurer Asterisk, toutes ces configurations se font via les fichiers de conf se trouvant dans /etc/asterisk/ ou /etc/

Zaptel.conf

http://www.voip-info.org/wiki-Asterisk+config+zaptel.conf

Chemin : /etc/

Description : Permet la configuration du matériel (cartes digium chez nous, TE110P, TE200P ou TDM400P).

Mise en place : Les modifications sont prises en compte avec une exécution de la commande ztconfig –vv. Un modprobe wcte11xp (pour une TE110P) est parfois necessaire.

Exemple 1: (configuration d’une TE200P sur deux E1)

span=1,1,0,ccs,hdb3,crc4 # configure le port 1 de la carte

bchan=1-15,17-31 #lignes de voix

dchan=16 #ligne de données

span=2,1,0,ccs,hdb3,crc4#configure le port 2 de la carte

bchan=32-46,48-62

dchan=47

loadzone = il #infos regionales

defaultzone=il #infos regionales

Exemple 2: (configuration d’une TDM400P avec 4 modules FX,.sur 4 ligne analogiques)

fxsks=1-4 ; pour fxo il faut definir fxs

loadzone=il

defaultzone=il

Zapata.conf

http://www.voip-info.org/wiki-Asterisk+config+zapata.conf

Chemin : /etc/asterisk/

Description : Décrit l’interfaçage entre Asterisk et le module zaptel.

Mise en place : Les modifications sont prises en compte avec un restart d’Asterisk.

Exemple : (suite du précédent)

[channels]

language=fr

callwaiting=no

threewaycalling=no

transfer=yes

immediate=no

echocancel=yes

echocancelwhenbridged=yes

echotraining=400

callerid=asreceived

;relaxdtmf=yes

rxgain=0.0

txgain=0.0

group=1

switchtype=national

pridialplan=unknown

signalling=pri_cpe ; pour un E1

context=entrants ; contexte ou aboutissent les appels entrants

channel => 1-15,17-31,32-46,48-62

language=fr

resetinterval=never

Extensions.conf

http://www.voip-info.org/tiki-index.php?page=Asterisk%20config%20extensions.conf

Chemin : /etc/asterisk/

Description : Fichier central d’Asterisk, décrit le dialplan , c'est-à-dire le cheminement de chaque appel entrant/sortant du PBX.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

[general]

static=yes

writeprotect=no

[xxxxxxx]

;****************** APPELS SORTANTS MANUELS ************************

exten => _9XX.,1,Set(DYNAMIC_FEATURES=automon) ; permet de s’autoenregistrer

exten => _9XX.,2,Set(DB(canaux/${CALLERID(ANI)})=${CHANNEL}) ;creeune valeur dans la db d’asterisk

exten => _9XX.,3,Dial(ZAP/g1/${EXTEN:1},60,tTwW);lance un appel sur la premiere ligne libre sur le materiel zap,essaies 60 secondes

exten => _9XX.,4,Agi(recup_statut.agi${DIALSTATUS}) ;lance un script agi

exten => _9XX.,5,Hangup

;****************** APPELS SORTANTS XXXXX

exten => _0XX.,1,Set(DYNAMIC_FEATURES=automon)

exten => _0XX.,2,Set(DB(canaux/${CALLERID(ANI)})=${CHANNEL})

exten => _0XX.,3,Dial(ZAP/g1/${EXTEN:1},60,tTwW)

exten => _0XX.,4,Agi(recup_statut.agi${DIALSTATUS})

exten => _0XX.,5,Hangup

;****************** APPELS SORTANTS IAX XXXXX

exten => _6XX.,1,Set(DYNAMIC_FEATURES=automon)

exten => _6XX.,2,Set(${CALLERID(number)}="")

exten => _6XX.,3,Dial(iax2/xxxxxx/${EXTEN:1},60,tTwW);utilize un canal iax pour lancer l’appel

exten => _6XX.,4,Agi(recup_statut.agi${DIALSTATUS})

exten => _6XX.,5,Hangup

;**************** CONSULTATION VOICEMAIL PERSO

exten => 77,1,VoiceMailMain(${CALLERID(ani)}@xxxxxx);ouvre le voicemail de l’appelant

exten => 77,2,HangUp

exten => 11,1,Answer

exten => 11,2,Background(decrochage-auto-2)

exten => 1,1,VoiceMail(xxxxxx@xxxxxx.com)

exten => 1,2,Hangup

;*********** ESPIONNAGE ******************

exten => 711,1,ChanSpy(SIP/maguy) ;espionne maguy

exten => 711,2,Hangup


;********** CONFERENCE CALL **************

;conference calling

exten => 1234,1,MeetMe(m)

exten => 1234,2,HangUp

;********** APPELS INTERNES XXXXXXXXXXXXX ***********************

;joseph

exten => 113,1,Answer

exten => 113,2,Dial(SIP/Sansfil3,20,tTwW)

exten => 113,3,Voicemail(xxxxx@xxx.com)

exten => 113,4,Hangup

exten => 128,1,Answer

exten => 128,2,Dial(SIP/hillel,20,tTwW)

exten => 128,3,Voicemail(xxxxx@xxxxx.com,su)

exten => 128,4,Hangup

[entrants] ;contexte des appels entrants

;******** SDA ENTRANTES XXXXXX ********

;Joseph

exten => XXXXXXX,1,Answer

exten => XXXXXXX,2,Dial(SIP/Sansfil3,20,tTwW)

exten => XXXXXXX,3,Voicemail(xxxxxxxx@xxxxxx,su)

exten => XXXXXXX,4,Hangup

;********* GROUPES ****************

;XXXX EXEMPLE DE IVR

exten => XXXXXXX,1,Answer

exten => XXXXXXX,2,Set(CALLERID(all)=groupe)

exten => XXXXXXX,3,Background(decrochage-auto)

exten => 1,1,Dial(SIP/xxxxx&SIP/yyyyy&SIP/zzzzzzz,,tTwW) ; fait sonner tout le monde

exten => 1,2,GotoIf($["${DIALSTATUS}" != "ANSWER"]?3:4)

exten => 1,3,Hangup

exten => 2,1,,Dial(SIP/xxxxx&SIP/yyyyy&SIP/zzzzzzz,,tTwW)

exten => 2,2,GotoIf($["${DIALSTATUS}" != "ANSWER"]?3:4)

exten => 2,3,Hangup

exten => 3,1,,Dial(SIP/xxxxx&SIP/yyyyy&SIP/zzzzzzz,,tTwW)

exten => 3,2,GotoIf($["${DIALSTATUS}" != "ANSWER"]?3:4)

exten => 3,3,Hangup

;******************************** RECEPTION FAX *****************************************

exten => YYYYYYY,1,Answer

exten => YYYYYYY,2,RxFAX(/var/spool/asterisk/fax/${UNIQUEID}.tif);cree un fichier fax avec un nom aléatoire dans /var/spool/asterisk/fax/ avec le fax entrant

exten => YYYYYYY,3,Hangup

[smsdial]

exten => _X.,1,Answer

exten => _X.,2,SMS(default,,${EXTEN},${MSG});envoi des SMS

exten => _X.,3,SMS(default)

exten => _X.,4,Hangup

sip.conf

http://www.voip-info.org/wiki-Asterisk+config+sip.conf

Chemin : /etc/asterisk/

Description : Fichier decrivant les utilisateurs sip d’Asterisk (softphones et hardphones utilisant le protocole sip).

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

[general] ; commun a tous les users

context=default

;bindport=5060

;bindaddr=0.0.0.0

srvlookup=yes

language=fr

[superuser];utilisateur superuser

type=friend ;peux appeler/recevoir

host=dynamic ; peut se connecter de tout ip

username=superuser

callerid="Samuel LEVY"

secret=xxxxxx ;mdp

dtmfmode=rfc2833 ;pour la detection des touches

context=xxxxxxx ; contexte (du dialplan) auquel appartient le user

disallow=all ; desactive tous les codecs

allow=all ;reactive tous les codecs

qualify=yes

mailbox=xxxxxx@xxxxxx ; boite vocale Samuel du groupe xxxxx

[joseph]

type=friend

host=dynamic

username=joseph

callerid="Joseph XXXXXXX"

secret=XXXXXXX

dtmfmode=rfc2833

context=xxxxxx

disallow=all

allow=all

qualify=yes

mailbox=xxxxx@xxxxx

iax.conf

http://www.voip-info.org/wiki-Asterisk+config+iax.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant les utilisateurs iax d’Asterisk (softphones et hardphones, autres serveurs Asterisk utilisant le protocole iax).

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple : définition d’un pont IAX entre les serveurs 192.168.42.5 et 192.168.168.39.

http://astrecipes.net/index.php?q=AstRecipes/Peering%20two%20Asterisk%20servers%20using%20IAX

Cote 192.168.168.39 :

[general]

bindport = 4569 ; Port to bind to (IAX is 4569)

bindaddr = 0.0.0.0 ; Address to bind to (all addresses on machine)

;definition codecs

disallow=all

allow=ulaw

allow=alaw

allow=gsm

mailboxdetail=yes

[xxxxxx];nom du user

type=friend

username=yyyyyy

secret=intellio

auth=plaintext

host=192.168.42.5

context=xxxxxx

peercontext=yyyyyy

qualify=yes

trunk=yes

Cote 192.168.42.5 :

[general]

bindport = 4569 ; Port to bind to (IAX is 4569)

bindaddr = 0.0.0.0 ; Address to bind to (all addresses on machine)

disallow=all

allow=ulaw

allow=alaw

allow=gsm

mailboxdetail=yes

[yyyyyy]

type=friend

username=xxxxxxx

secret=intellio

auth=plaintext

host=192.168.168.39

context=yyyyyy

peercontext=xxxxxxx

qualify=yes

trunk=yes

voicemail.conf

http://www.voip-info.org/wiki-Asterisk+config+voicemail.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant les boites vocales.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

;boites vocales

[general]

format=wav49gsmwav ;format des messages

maxmessage=180 ;duree maximale d un message en secondes

mailto:serveremail=asterisk@cieltelecom.com ; serveur envoyant les mails contenant les mesages

attach=yes

silencethreshold=128

maxlogins=3

[xxxxxx] ;groupe xxxxxx

eric => 1212,eric,eric.xxxxx@xxxxx.com ;mdp,user,email

musiconhold.conf

http://www.voip-info.org/wiki-Asterisk+config+musiconhold.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant la musique d’attente passant lors des mises en attente/transferts.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

[default]

mode=files

directory=/var/lib/asterisk/moh-native ; c’est ici qu’il va chercher les fichiers (doivent etre wav) pour la musique d’attente

features.conf

http://www.voip-info.org/wiki-Asterisk+config+features.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant es fonctions spéciales activées lors de combinaisons de touches.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

;fonctions speciales

[general]

parkext => 700 ; What extension to dial to park

parkpos => 701-720 ; What extensions to park calls on. These needs to be

context => parkedcalls ; Which context parked calls are in

[featuremap]

blindxfer => ** ;tranfert fait par **+extension

automon => *1 ; enregistrement de la conversation avec *1

modules.conf

http://www.voip-info.org/wiki/index.php?page=Asterisk+config+modules.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant les modules à activer lors du démarrage d’asterisk.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

manager.conf

http://www.voip-info.org/tiki-index.php?page=Asterisk%20config%20manager.conf

Chemin : /etc/asterisk/

Description : Fichier décrivant les paramètres de connexion au manager d’Asterisk.

Mise en place : Les modifications sont prises en compte avec un reload d’Asterisk.

Exemple :

[general]

enabled = yes

webenabled = yes

port = 5038

bindaddr = 0.0.0.0

[superuser]

secret = xxxxxxx

permit=127.0.0.1

permit=192.168.168.17

read = system,call,log,verbose,command,agent,user

write = system,call,log,verbose,command,agent,user

Installation d'un IPBX Asterisk

Objet

Le but de ce document est de décrire le processus d’installation et de déploiement d’un PBX Asterisk.

Description du logiciel

Asterisk est un logiciel Open Source qui remplit toutes les fonction d’un PABX traditionnel (gestion des extensions, boites vocales, mises en attente, transferts, écoute, soufflage, files d’attente, conférence…).

Asterisk est capable de fonctionner sur quasiment n’importe quel OS, cependant nous orienterons ce document sur son installation/fonctionnement sur une plateforme Linux.

Exemple de réseau téléphonique utilisant Asterisk :

Installation d’Asterisk

Introduction

Dans la configuration qui nous intéresse, Asterisk nécessite l’installation de plusieurs programmes :

Asterisk : le pbx en lui-même

Zaptel : le binaire qui permet l’interfaçage avec le matériel se connectant au réseau RTC (cartes digium , nous avons une expérience avec la carte E1 TE110P , la carte 2 E1 TE200P , la carte analogique TDM400P)

Libpri : la librairie permettant de gérer le PRI.

Asterisk-addons : ajouts a asterisk.

Spandsp : pour envoyer/recevoir des fax

Nous partons sur le principe que la machine sur laquelle va être installe Asterisk tourne sous Linux (Debian pour ma part :-))

Processus d’installation

Installer les paquets nécessaires a la compilation d’Asterisk, bison,bison-devel, , zlib1g zlib1g-dev libncurses5 libncurses-dev libssl0.9.6 libssl-dev libnewt-dev libnewt0.51.

Télécharger les archives de asterisk,zaptel,libpri,asterisk-addons sur le site de http://www.asterisk.org/downloads.%20Dans%20le%20répertoire%20/usr/src/

Décompresser les archives.

Aller dans le répertoire de zaptel , faire un ./configure , make et make install

Faire un modprobe zaptel et un modprobe wcte11xp (ou autre driver si pas TE110P).Executer ensuite ztcfg –vv pour configurer le hardware zaptel.

Aller dans le répertoire de libpri , faire un ./configure , make et make install

Il faut ici intercaler l’installation de spandsp (http://www.asteriskguru.com/tutorials/spandsp.html)pour les fax :

Télécharger spandsp (version 3) sur http://soft-switch.org/

télécharger app_txfax.c app_rxfax.c et asterisk.patch a http://soft-switch.org/

installer libtiff

compiler et installer spandsp ( ./configure, make et make install)

mettre app_txfax.c app_rxfax.c dans le répertoires apps/ des sources d’Asterisk

appliquer le patch asterisk.patch dans le répertoire des sources

exécuter ldconfig

(peut être optionnel, a résolu des heures de galère pour moi), commenter la ligne ast_frfree(inf); dans app_txfax.c app_rxfax.c

Aller dans le répertoire de asterisk , faire un ./configure , make et make install

Aller dans le répertoire de asterisk-addons , faire un ./configure , make et make install.

Si une des compilations ne se passe pas correctement, il faut s’assurer que tous les paquets nécessaires ont été installés, ainsi que les kernel-headers.

Installer les langues françaises, en les décompressant dans /var/lib/asterisk/sounds/fr. Vérifier que la musique d’attente est dans /var/lib/sounds/asterisk/moh-native (ou autre voir musiconhold.conf)


ANNEXE : Script d’installation

#!/usr/bin/sh

# Samuel Levy Janvier 2007 Script d'installation asterisk pour debian

#recuperation de la version du kernel

versionkernel=`cat /proc/version awk '{print $3}'`

versionasterisk="1.4.0"

versionzaptel="1.4.0"

versionlibpri="1.4.0"

versionaddons="1.4.0"

cd /usr/src/

#installation des headers du kernel necessaires a la compilation de zaptel

sh apt-get install kernel-headers-$versionkernel

#recuperation des paquets necessaires a l'installation d'Asterisk

apt-get install zlib1g zlib1g-dev libncurses5 libncurses-dev libssl0.9.6 libssl-dev libnewt-dev libnewt0.51

#recuperation des archives de zaptel,asterisk,libpri et asterisk-addons

wget http://ftp.digium.com/pub/asterisk/releases/asterisk-$versionasterisk.tar.gz && wget http://ftp.digium.com/pub/zaptel/releases/zaptel-$versionzaptel.tar.gz && wget http://ftp.digium.com/pub/libpri/releases/libpri-$versionlibpri && wget http://ftp.digium.com/pub/asterisk/releases/asterisk-addons-$versionaddons.tar.gz

#decompression des archives

tar -xvzf asterisk-addons-$versionaddons.tar.gz

tar -xvzf asterisk-$versionasterisk.tar.gz

tar -xvzf libpri-$versionlibpri.tar.gz

tar -xvzf zaptel-$versionzaptel.tar.gz

#installation de zaptel , libpri , asterisk , asterisk-addons

cd zaptel-$versionzaptel

make clean

./configure

make

make install

cd libpri-$versionlibpri

make clean

make

make install

cd asterisk-$versionasterisk

make clean

./configure

make

make install

make samples

cd asterisk-addons-$versionaddons

make clean

./configure

make

make install

echo "INSTALLATION D'ASTERISK TERMINEE !!!"


Troubleshooting

Asterisk,zaptel ou libpri ne compilent pas

Dans ce cas de figure il faut bien vérifier que toutes les dépendances nécessaires ont bien été installées.

Vérifier également que les kernel headers correspondants ont été installes sur la machine.

Bien respecter l’ordre d’installation, zaptel,libpri,asterisk.

Problèmes de son, coupures, friture

Même dans le cas d’une installation réussie, peuvent subsister des problèmes de qualité sur la ligne.

Dans la majeure partie des cas il s’agit de soucis d’IRQ , il convient de vérifier avec la commande lspci –vb si la carte ne partage pas son IRQ , si c’est le cas il faut s’arranger pour qu’elle soit seule (désactiver l’usb ,le son, changer de slot PCI par exemple).

Il existe des outils de diagnostics pour voir si l’interface fonctionne correctement ;

Zttool , qui permet de vérifier si des IRQ ne sont pas perdus (sources de soucis sur la ligne)

Zttest (cd /usr/scr/zaptel ; ./zttest) , a laisser tourner 5 minutes , un plus mauvais résultat inférieur a 99,98% peut être source de soucis.

Problèmes de reconnaissance DTMF

Mettre la valeur dtmfmode=rfc2833 dans le sip.conf.

Asterisk ne démarre pas

C’est souvent un souci de chargement de modules, désactiver dans le modules.conf le chargement des modules incrimines.