Asteriko
Le but d'asteriko est de permettre aux utilisateurs de générer des fichiers de configurations sans avoir à le editer. La solution d'asteriko est de stocker en base de données les informations concernant les utilisateurs et de générer ces fichier de configuration à intervals réguliers par l'intermédiaire d'une cron. Le projet se résume donc en deux parties, une parties IHM -> BDD et l'autre BDD -> Fichiers de conf. Les fichiers de configurationIl est évident que la partie fichier de configuration nous impose de faire le choix d'un modèle de fonctionnement et d'organisation des différents utilisateurs dans ces fichiers de configurations. Dans ce documents nous ne parlerons que des fichiers de configuration IAX, EXTENSIONS et VOICEMAIL qu constitue pour le moment une base suffisante de réflexion. Fichier IAX.CONFLa définition des paramètres du protocolUne première partie consiste à régler le protocole: Port, Ip, Jitter [general] bindaddr=0.0.0.0 bandwidth=low echocancel=yes jitterbuffer=yes maxjitterbuffer=500 maxexcessbuffer=100 dropcount=3 tos=lowdelay mailboxdetail=yes language=fr disallow=all allow=gsm Nb: La section ci-dessus reste à optimiser en ce qui concerne les paramètres du jitterbuffer. Des tests de mesures sont à prévoir. La définition des usersUne fois les paramètres du protocol définis, on peut passer à la définition des users succeptibles de se connecter à Asterisk. Deux types de peers sont à prévoire:
Dans le cas du user il faut prévoir des sections comme suit par serveur [NomDeMonServeur] type=friend host=dynamic secret=MonMotDePasse Nb: Dans le cas d'un peer en IP fixe, renseigner la section "host" par le nom de domaine voir ip du peer. Dans le cas d'un user standard Contrairement aux premiers essais menés, il est impératif que les users soient identifiés par des numéros plûtot que par des noms pour des raisons de simplification du fichier extensions.conf La section doit donc resembler à la suivante : [NumeroExtension] type=friend host=dynamic secret=MonMotDePasse context=Internationnal callerid => ""MonPrenom MonNom" <NumeroExtension> mailbox=NumeroExtension Nb: En IAX il n'est pas possible de définir plus d'un seul context. Toutefois l'inclusion de contexts entre eux rend possible de définir très clairement la discrimination ou autrement dit les droits d'appel des utilisateurs. L'exemple ci-dessus ne permet pas d'afiner la discrimination et de finir le ou les pays accessibles à cet utilisateur. Une liste de context et de groupe de contexts doit donc être défini pour donner l'accès à l'utilisateur à un pays en particulier ou à un groupe de pays (Europe, Asie, Usa, Europe fixe, Europe Mobile, France Fixe, France Mobile ...) ou à la totalité de l'internationnal (Comme l'exemple ci-dessus) Le user de protection contre les login anonymes Pour des raisons de sécurité, il est impératif de déclarer un user "guest". Cette opération permet de rejeter les logon sans username ni mot de passe. Ce user ne doit être associé à aucun context défini dans extensions.conf. [guest] type=user host=dynamic Fichier VOICEMAIL.CONFLa définition du comportement de la VoicemailComme pour IAX.CONF, la section général est succeptible d'être paramétrée pour permettre à l'administrateur de personnalisé l'envoi de voicemail (emetteur, corps du message...) mais aussi durrées d'enregistrement, d'archivage des voicemails... [general] ; Default formats for writing Voicemail ;format=g723sf|wav49|wav format=wav49|gsm|wav fromstring=amnesia serveremail=amnesia@no-log.org ; Should the email contain the voicemail as an attachment attach=yes ; Maximum length of a voicemail message in seconds ;maxmessage=180 ; Maximum length of greetings in seconds ;maxgreet=60 ; How many miliseconds to skip forward/back when rew/ff in message playback skipms=2000 ; How many seconds of silence before we end the recording maxsilence=10 ; Silence threshold (what we consider silence, the lower, the more sensitive) silencethreshold=128 ; Max number of failed login attempts maxlogins=3 envelope=no ;Corps du message emailbody=Yo ${VM_NAME}:\n\nUn petit mot d'amour d'amnesia histoire qu'il n'oublie pas...\n\n Le message est de ${VM_DUR}(numéro ${VM_MSGNUM}) minutes dans la boite ${VM_MAILBOX} et provient de ${VM_CALLERID}, à la date du ${VM_DATE}. Prend le temps d'y jetter un coup d'oeil.\n\n signé... j'ai déjà oublié :-)\n\n\nYo ${VM_NAME}:\n\n A little love message from amnesia just to avoid it to forget...\n\n The message is ${VM_DUR}(numéro ${VM_MSGNUM}) minutes long in mailbox ${VM_MAILBOX} and comes from ${VM_CALLERID}, on ${VM_DATE}. Take time to have a look on it.\n\n signed... I already forgot :-)\n ; ; You can override the default program to send e-mail if you wish, too ; ;mailcmd=/usr/sbin/sendmail -t ; ; Users may be located in different timezones, or may have different ; message announcements for their introductory message when they enter ; the voicemail system. Set the message and the timezone each user ; hears here. Set the user into one of these zones with the tz= attribute Nb: Cette configuration est celle d'amnesia La définition des décalages horaires[zonemessages] eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp central24=America/Chicago|'vm-received' q 'digits/at' H 'digits/hundred' M 'hours' Nb: Cette section présente le seul endroit de toute la conf d'asterisk où on peut associer le décalage horaire associé à un utilisateur. Les lignes ci-dessus précise les TimeZones. Ces TimeZones sont normalement utilisés dans la section ci-dessous même si ce n'est pas le cas dans l'exemple choisi. La définition des utilisateurs[default] MonEntension => MonCodeDePasse,MonPrenom MonNom,MonAdresse@MonDomaine.xx Rien de bien sorcier la dedans sauf peut-être la conf des TimeZones qui à première vue ne parraissent pas si simples. Fichier EXTENSIONS.CONFCe fichier est utilisé pour le règles de routage et de discrimination. Dans notre cas un numéro doit obligatoirement faire partie d'un context (internal, nationnal...) afin de permettre un utilisateur déclaré d'accéder aux numéros des contexts auxquels il appartient. Configuration général du fichier[general] static=yes writeprotect=no Ces deux options permettre de restreindre l'accès au fichier de conf. Il est préférable de laisser ces deux options avec les valeurs ci-dessus si on veut pouvoir regénére le fichier. La macro de routage d'un appel vers un agent[macro-stdexten] ; ; Standard extension macro: ;${ARG1} - Extension (we could have used ${MACRO_EXTEN} here as well ;${ARG2} - Device(s) to ring IAX ; exten => s,1,SetMusicOnHold(default) exten => s,2,Dial(${ARG2},10) ; Ring the interface, 10 seconds maximum exten => s,3,Voicemail(u${ARG1}) ; If unavailable, send to voicemail w/ unavail announce exten => s,5,Hangup ; Hang them up. exten => s,103,Voicemail(b${ARG1}) ; If busy, send to voicemail w/ busy announce exten => s,104,Hangup ; Hang them up. Cette macro permet d'essayer de joindre un extension ${ARG1} et en cas de non réponse ou d'occupation de basculer sur la messagerie vocale de l'utilisateur. Le context des servicesDans notre exemple tous les services sont regroupés dans deux contextes [test-services] et [user-services]. Si à l'avenir on veut pouvoir dissocier les services pour n'en attribuer que un parmis plusieurs à un utilisateur, il faudra créer un ou plusieurs groupes de services afin d'effectuer la discrimination C'est aussi ce contexte qui va définir le script du server vocal interactif (SVI) permettant l'acceuil de personnes non enregisrtées (appels arrivant par la cart ZAP). Une réflexion doit être menée pour définir la façon dont on doit donner accès au reste des services et context pour ce type d'utilisateurs. Un acces pas login/mot de passe pourrait petre une solution si les fonctions d'acces à la base de dnnées sont suffisants. [tests-services] ; ; Create an extension, 600, for dialing the ; Asterisk demo. ; exten => 600,1,Playback(demo-abouttotry); Let them know what's going on exten => 600,2,Dial(IAX2/guest@misery.digium.com/s@default) ; Call the Asterisk demo exten => 600,3,Playback(demo-nogo) ; Couldn't connect to the demo site exten => 600,4,Goto(s,6) ; Return to the start over message. ; ; Create an extension, 601, for evaulating echo latency. ; exten => 601,1,Playback(demo-echotest) ; Let them know what's going on exten => 601,2,Echo ; Do the echo test exten => 601,3,Playback(demo-echodone) ; Let them know it's over exten => 601,4,Goto(s,6) ; Start over [user-services] ; ; Give voicemail at extension 700 ; exten => 700,1,VoicemailMain exten => 700,2,Hangup ; ; Or a conference room (you'll need to edit meetme.conf to enable this room) ; exten => 800,1,MeetMeCount(1234) exten => 800,2,Meetme,1234 Un contexte pourra même être créé pour donner acces à tous les services d'un coup. [All-Services] include => user-services include => tests-services Le context des appels entrantsCe context est réservé aux appels entrants effectués par l'intermédiaire de l'interface Zaptel ou H323. Il est donc dans un premier temps restreint aux services. Il n'est pas question pour le moment de donner accès au reste du plan de numérotation sans identification du user. Ce context part du principe que l'appelant connait l'existance d'un SVI qui se déclenche pendant les 4 secondes avant le transfert vers une extension par défaut. Cet exemple simule donc un SVI caché donnat accès aux services mais qui donne l'impression d'être un répondeur.Une version purement SVI doit donc être développée. [menu] include => All-Services exten => s,1,Wait,15 exten => s,2,Answer exten => s,3,DigitTimeout,2 ; Set Digit Timeout to 5 seconds exten => s,4,ResponseTimeout,4 ; Set Response Timeout to 10 seconds exten => #,1,Dial(IAX2/MyIaxUser:MyIaxPassword@MyDomainName/MyExtension@MyContext) ;Used to ring a specific extension if no key is pressed by the user exten => t,1,Goto(#,1) ; If they take too long goto to previous line to route call to any extension exten => i,1,Playback(invalid) ; "That's not valid, try again" exten => _XXX,1,Dial(IAX2/${EXTEN}@All-Services) [menu-SVI] exten => s,1,Wait,15 exten => s,2,Answer exten => s,3,DigitTimeout,2 ; Set Digit Timeout to 5 seconds exten => s,4,ResponseTimeout,4 ; Set Response Timeout to 10 seconds exten => s,5,BackGround(IVR_VoiceGuide) exten => 1,1,Goto($SVI1,1) ;If key 1 is pressed go to extension SVI1 exten => 2,1,Goto($SVI2,1) ;If key 1 is pressed go to extension SVI2 exten => 3,1,Goto($SVI3,1) ;If key 1 is pressed go to extension SVI3 exten => t,1,Goto(s,5) ; If they take too long goto to previous line to route call to any extension exten => i,1,Playback(invalid) ; "That's not valid, try again" Le context des users standards ou context [Internal][Internal] exten => _5XX,1,GotoIf($"${EXTEN}" = "506"?MyContext,MyExtension,1) exten => _5XX,2,Playback(transfer,skip) exten => _5XX,3,Macro(stdexten,${EXTEN},IAX2/${EXTEN}) include => All-Services Nb: Ici on considère que les users internes sont tous déclarés dans IAX.CONF par des user commençant par 5 et qui sont sur 3 digits. Le user 506 a également programmé que tous les appels arrivant sur son poste soient redirigés vers le numéro d'un context bien précis. Pour d'autres protocoles que IAX, il est possible d'etendre la regle en definissant differentes plages d'extensions en fonction du protocole. Par exemple 5XX pour IAX, 4XX pour SIP et 3XX pour le H323. Le context des users standards ou context [Internationnal]Dans notre postulat de base du fichier iax.conf, chaque user faisait parti d'un ou plusieurs contextes. Dans notre cas je prend parti de dire que toutes les destinations internationnales sont organisées en Continents, puis pays et finalement par asterisk boxes du pays. ;Contexte incluant tous les continents [Internationnal] include => Internal include => Europe include => Asia include => Usa include => Africa include => Russia ;Contexte incluant tous les pays d'europe où des serveurs asterisk sont présents [Europe] include => Internal include => France include => UK include => Italy include => Germany include => Spain ;Contexte incluant les asterisk boxes présentes en France [France] include => Internal ;Serveur asterisk de Loïc sur la carte ZapTel en 0033 entre 00h00 et 04h00. Le serveur de loic est registred on peut donc utilisé le nom d'enregistrement. exten => _00033.,1,GotoIfTime(00:00-4:00|mon-fri|*|*?France,${EXTEN},3) ;On attend 5 secondes la réponse du site distant. exten => _00033.,2,Dial(IAX2/user:password@IaxRegistredName/${EXTEN}@France,5) ;Si Loïc n'est pas dispo serveur asterisk de Tom sur la carte ZapTel en 0033 entre 00h00 et 04h00. Le serveur de tom n'est pas enregistré on doit donc utiliser un nom de domaine. exten => _00033.,3,GotoIfTime(00:00-4:00|mon-fri|*|*?France,${EXTEN},5) ;On attend 5 secondes la réponse du site distant. exten => _00033.,4,Dial(IAX2/user:password@domaine2.fr/${EXTEN}@France,5)
exten => _00033.,5,GotoIfTime(00:00-4:00|mon-fri|*|*?France,${EXTEN},7) ;On attend 5 secondes la réponse du site distant. exten => _00033.,6,Dial(IAX2/user:password@domaine3.fr/${EXTEN}@France,5) ;Si aucun des trois sites alors joue un guide d'encombrement exten => _00033.,7,Answer exten => _00033.,8,Playtones(congestion) exten => _00033.,9,Wait(5) exten => _00033.,10,StopPlaytones exten => _00033.,11,Hangup ;Définition des extensions locales de Loïc qui ne sont pas des users d'amnesia ;Pour que ca fonctionne, Loïc doit déclarer ses extensions dans le context 'France' et doivent commencer par 1 suivi de 3 digits et Tom par 3 suivi de 3 digits exten => _331XXX,1,Dial(IAX2/user:password@domaine1.fr/${EXTEN:2}@France) exten => _333XXX,1,Dial(IAX2/user:password@domaine2.fr/${EXTEN:2}@France) ;En cas de timeout sur les extensions locales on joue un guide d'encombrement exten => t,1,Answer exten => t,2,Playtones(congestion) exten => t,3,Wait(5) exten => t,4,StopPlaytones exten => t,5,Hangup [UK] include => Internal ;Serveur asterisk de Damian exten => _00044.,3,Dial(IAX2/user:password@domaine.co.uk/${EXTEN}@default) ;Définition des extensions locales de Damian qui ne sont pas des users d'amnesia ;Pour que ca fonctionne, Damian doit déclarer ses extensions dans le context default et doivent commencer par 2 suivi de 3 digits exten => _2XXX,1,Dial(IAX2/user:password@domaine.co.uk/${EXTEN}@default) Redirection des appels sur des serveurs dans un LAN utilisant du NATL'exemple de routage entre les peers de loïc, tom et mose montre deux alternatives pour le routage des appels. Loïc utilise du NAT dans sont LAN avec un serveur Asterisk ainsi qu'un client IAX. Ce que vous devez savoir c'est que le IAX utilise le port 4569 par defaut pour le premier client ou serveur (si un autre port n'a pas ete precise dans le fichier iax.conf). Si ensuite un autre client ou serveur se lance, il pourra utiliser le port 14569 par exemple. Imaginez que vous avez definit une regle de routage sur votre routeur qui forward les packets en UDP 4569 depuis votre IP publique vers votre Asterisk box. Que se passe-t-il si votre Asterisk box demarre apres votre client IAX? Dans ce cas precis, n'utilisez pas de port forwarding sur votre routeur mais preferez enregistrer votre asterisk box sur un serveur distant de cette maniere il pourra vous joindre sans avoir a preciser ni port ni nom de domaine et vous pourrez demarrer votre client IAX ainsi que votre asterisk box dans l'ordre aue vous voulez. Si vous voulez aue des clients externes puissent joindre votre asterisk box, il est en effet problematiaue de ne pas definir de port forwarding. Il vous suffit donc de preciser un port specifique dans iax.conf, ensuite de definir le port forwarding sur ce port sur votre routeur et de demader a vos clients d'utiliser ce port specifique. Si ce n'est pas possible, faites tres attention dans de demarre votre Asterisk box avant un quelconque client IAX dans votre LAN. Le premier des deux peers prendra le port 4569 alors que le suivant poura prendre le port 14569 c'est le protocole IAX qui dicte cette regle. Il n'est donc pas nécessaire de définir une regle de NAT sur le routeur. Il faut en revanche enregistrer le serveur asterisk de Loïc (avec le mot clé register dans la section genereal de iax.conf) afin de bien pouvoir dissocier les deux peers. En revanche Tom ayant dédier le host domane2.fr au IAX il n'est pas nécessaire de l'enregistrer. Ordre d'imbrication des contextsL'ordre d'imbrication des contexts est tres important dans l'écriture du fichier de configuration. En effet, principalement en raison des débordements il est obligatoire de restecter un certain ordre afin d'éviter les débordements non justifiés. L'ordre à utiliser dans notre cas est le suivant: [macro-stdexten] [Internationnal] [Europe] [France] [UK] ajouter les autres pays d'europe dans le même ordre que celui défini dans le context [Europe] [Asia] Ajouter les autres continents dans le même ordre que celui défini dans [Internationnal] [Internal] [All-Services] [tests-services] [user-services] Fichier ZAPATA.CONF[trunkgroups] [channels] language=fr context=menu ;Defined in extensions.conf rxwink=300 usedistinctiveringdetection=no usecallerid=no hidecallerid=yes callwaiting=yes usecallingpres=no callwaitingcallerid=no threewaycalling=yes transfer=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes rxgain=0.0 txgain=0.0 group=1 callgroup=1 pickupgroup=1 immediate=no amaflags=billing busydetect=yes busycount=4 callprogress=no progzone=fr signalling=fxs_ks context=menu channel => 1 La base de donnéesLa base de données est intimement liée au format du fichier. Pour homogeneiser les données communes à plusieurs ficheirs certaies informations vont donc pouvoir être regroupées dans une même table. Schéma relationnelLe schéma relationnel de la base de données sera le suivant. Chaque table est ensuite détaillée dans les sections suivantes. Attention ce schéma n'est pas à jour et ne correspond plus aux tables suivantes. La table "ast_uers"Définiton de la tableCette table est la clé de voute du schéma relationnelle d'asteriko.
Script de créationLa table "ast_groups"Définiton de la tableCette table permet d'associer aux utlisateurs ou tout objet faisant référence à un "context". En effet, les context au sens Asterisk et les groups sont très similaires c'est pourquoi ils ont été regroupés.
Script de créationLa table "ast_parent_groups"Définiton de la tableCette table permet de créer des liens entre les groupes. Parceque les groupes sont en fait des 'contexts' il est très utile de pouvoir les inclure les uns dans les autres.
Script de créationLa table "ast_hosts"Définiton de la tableCette table est utilisée pour définir tres precisement les hosts en relation avec l'installation asterik. Les hosts en relation sont soi utilisés pour définir les serveurs asterisk à enregistrer soi pour défnir les droits d'acces des autres serveurs asterisk sur celui-ci. Cette table idéalement prévue pour des interconnexions en IAX pourra être étendue aux autres protocoles en précisant le service associé par l'intermédiaire du champ hostsServId.
Script de créationLa table "ast_iax"Définiton de la tableCette table est désormais obselete.La table "ast_services"Définiton de la tableCette table permet de définir les services disponibles. Ces services peuvent etre soit des protocoles comme IAX ou des service utilisateurs comme les Voice-Mails.
Script de créationLa table "ast_services_options"Définiton de la tableCette table permet de définir les options propres à chaque service disponible.
Script de créationLa table "ast_conf_rooms"Définiton de la tableCette table permet de définir les conference rooms ainsi que les mots de passe et heures d'ouvertures des conference rooms.
Script de créationLa table "ast_trunks"Définiton de la tableCette table permet de definir des faisceaux ou trunks definisant les liens entre plusieurs serveurs et quels sont les numeros ou extensions permettant de les utiliser.
Script de création
Contributors to this page: loic
|
Search Search Wiki PageName |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||