PDA

Voir la version complète : Solution pour alternance trunk "smart"



fastm3
25/07/2014, 17h56
Pas toujours évident de trouver des idées de tutoriel "utiles" et en meme temps ni trop simples , ni trop complexes.
Le but ici est de décrire une intégration complète d'un AGI un peu "intelligent" avec Freepbx mais ca ne reste qu'un bout de dialplan intégrable avec d'autres solutions comme xivo par exemple.

Il y a quelques temps, on avait décrit la manière d'alterner différents trunks pour une meme destination. Cela peut etre utile pour ceux disposant de plusieurs lignes avec un certain quota pour utiliser au mieux leur forfait.
L'approche LCR ( least cost routing ) n'est pas suffisante pour ces cas ou 2 fournisseurs ont des couts identiques. De plus, les forfaits "illimité" sont apparus. Illimité mais pas sans limite...L'illimité n'est valide que pour un certains nombre de numéros.

Imaginons donc le cas ou on désire gérer au mieux ce type de fournisseurs. Les besoins sont assez simples en fait:
- Il faut essayer d'utiliser toujours la même ligne illimité pour un même numéro appelé.
- If faut répartir les appels sortants sur les lignes "illimitées' disponibles afin d'optimiser les usages.

Avec 10 lignes à 100 numéros illimités, si on gère très mal et en fonction de l'usage. On risque très vite de faire du hors forfait avec pas beaucoup plus de 100 numéros distincts appelés. L'idée est d'optimiser au maximum et automatiquement pour atteindre les 1000 numeros illimités possible sans aucun hors forfait ( dépassement de 100 numéros sur une ligne "illimitée" )


Je joins un agi "exemple" pour optimiser n lignes limitées à 100 numéros tels que les lignes chez OVH par exemple. Cela pourrait être utiliser également avec des gateways de mobiles ou les opérateurs ont le même type de limitation pour l'illimité.

J'ai essayé de commenter le code de l'agi en perl qui initialement était fait pour du LCR classique.
Je l'ai mis en ligne ici : https://github.com/fastm3/distributed-trunk-agi

Les étapes de l'intégration sont les suivantes:
1- Copie du contexte [ovh-versfixes-trunks] dans le fichier de conf ( extension_custom.conf pour freepbx ).
2- Création d'une table mysql qui stockera les données nécessaires. On pourra utiliser la base asterisk deja utilisé par freepbx par exemple.

Voici le sql à exécuter:

CREATE TABLE IF NOT EXISTS `ovhcalls` (
`number` bigint(20) unsigned NOT NULL,
`trunk` int(10) unsigned NOT NULL,
`lastchanged` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`number`,`trunk`),
UNIQUE KEY `numero` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

On stocke juste l'association numéro/ligne avec un petit timestamp.

3- mettre a jour dans le script nom de la base/user/password pour l'accés avec vos valeurs.
my $db_base="asteriskcdrdb";
my $db_login="asteriskuser";
my $db_password="????";

4- donner/indiquer au scripts les numeros de trunks qu'il doit utiliser pour le dial. Les trunks seront juste l'id dans freepbx pour une intégration facile.

5- Créer un custom trunk qui pourra etre utiliser dans le gui de Freepbx pour les outbounds routes. Le custom trunk aura cette définition: local/$OUTNUM$@ovh-versfixes-trunks
Voir le précédent article sur les customs trunks avec Freepbx.

Dorenavant, chaque appel utilisant ce custom trunk "intelligent" utilisera automatiquement la même ligne que précédemment. Le script veillera en même temps a ce que toutes les lignes "illimités" soient uniformément utilisées pour eviter tout hors forfait sur une ligne en particulier. Tout est resetté tous les mois, il n'y a donc pas de maintenance particulière à faire.

Avant de le "brancher" en prod , on pourra tester l'agi en ligne de commande de cette manière:

/var/lib/asterisk/agi-bin# ./ovh-versfixes-trunks.pl test 0102030405
On doit avoir en retour les numéros de trunks dans l'ordre le plus optimisé. On pourra vérifier qu'un même numéro retourne par exemple toujours le même trunk en position 1. Les positions 2 et 3 sont dans le cas ou le "meilleur" trunk est déjà occupé.


Ce script est utilisé en prod depuis de nombreuses années. Il est fonctionnel mais il nécessite d'avoir quelques connaissances pour son installation. ;-)

Bon tests.
Francois.

_AK_
28/07/2014, 09h25
Très joli post!
Un tuto effectivement intéressant, pas trop compliqué mais qui aurait demandé pas mal de travail pour mettre la même chose en place.
Pour ma part je n'en ai pas l'utilité mais c'est une très belle contribution.
Si d'autres se sentent de faire des contributions de ce niveau, ce serai top!

daffscat
23/04/2015, 00h34
La première fois que j'ai vu ce post je me suis dit "YES !, Voila une approche intelligente pour optimiser mes abonnements". Du très bon boulot!

J'ai essayé de suivre les conseils afin de l'intégrer sur XIVO:
- En premier, il a fallu modifier un peu le code de l'AGI car XIVO utilise PostgreSQL par défaut. Il faut modifier la structure de la base, installer le module PostgreSQL DBD driver, rajouter Asterisk::AGI et Data :: Dump qui ne sont pas utilisé par XIVO ... après avoir modifié le code Perl et testé en console: OUF, il marche comme souhaité.

Maintenant, j'ai des doutes qu'il marche une fois lié avec mon installation, notamment concernant les id des trunks. Sous FreePBX, il est indiqué qu'il faut récupérer les id dans l'interface, section trunks (si url finie par OUT_4 , l'id est 4).Sous XIVO, j'ai bien un id pour mes trunk mais fonctionnera t'il de la même façon ?

- Je me retrouve surtout coincé avec la configuration du contexte [ovh-versfixes-trunks] et le custom trunk:
Pour le contexte, j'imagine 2 possibilités; éditer le fichier /etc/asterisk/extensions_extra.d/ovh-versfixes-trunks.conf en conservant les directives du tutoriel (mais j'ai pas l'impression que "dialout-trunk" soit disponible sous XIVO)... ou éditer directement depuis l'interface WEB de XIVO, en utilisant le menu des Appels sortants.
Pour le custom trunk, même galère. Il y a bien une définition "personnalisée" des trunks (Interconnexion personalisée) mais la documentation officielle XIVO est limitée à ce sujet.

Bref, si quelqu'un à déjà intégrée cette solution sur XIVO, PLEASE PLEASE, partagez votre expérience!
Si vous avez le moindre conseil à donner, n'hésitez pas, je rapporterai les résultats au mieux de mes faibles compétences en la matière.

Dans tous les cas, Merci "fastm3" d'avoir publié ce tuto ! :clap2:

fastm3
23/04/2015, 11h16
Au moins , tu es motivé. Ca donne forcement plus envie de t'aider. Et tu as deja fait pas mal de chose.
Je n'ai pas le temps de remonter un xivo et je suis probablement encore moins a l'aise sur celui-ci que toi.
Je pense que tu as la bonne approche. Voila ce a quoi je pense meme si pas testé.

Le premier "probleme" est de balancer le dial vers notre "smart" trunk avec xivo.
Les customs trunks de Freepbx ne sont pas magiques, il faut juste regarder le dialplan généré. Avec Xivo il faut faire regarder dans le cli. Avec Freepbx , c'est dans les fichiers.

En fait le custom trunk de freepbx dans ce cas , c'est juste un dial de local/<EXTEN>@ovh-versfixes-trunks

Donc avec xivo, les custom interconnections devraient pouvoir le faire ( d'apres la doc , pas testé )
Interface , tu mets local et suffixe @ovh-versfixes-trunks. Ca devrait le faire.
On prends la methode des routes de xivo et on redirige vers cette interconnexion les appels 0XXXXXXXXX ( les fixes )

La on arrive a se retrouver avec l'id du trunk ( interconnexion qu'on va reellement utilisé ) en fin du contexte ovh-versfixes-trunks
Ensuite , il faut donc juste lancer le dial sur l'interconnexion qu'on aura selectionnée.

Avec FreePbx, je connais la macro dialout-trunk qui a besoin de l'id, c'est plus sympa de reutiliser les trunks definis dans 'interface graphique meme si on pourrait ecrire en direct le dial.
Je suis sur qu'il doit y avoir une macro ou subroutine qui fait ca dans xivo. Faut juste la trouver. Si tu as un xivo , en examinant le dialplan sur une de tes routes, tu devrais trouver je pense.
Note que tu peux aussi directement lancer le dial dans l'agi plutot que de setter une variable et faire ca dans le dialplan si cela est plus simple par exemple de mettre tout en dur.
Un peu moins "propre" neanmoins.
Curieusement , je n'ai trouver aucun article associant LCR et xivo pouvant aider, ca serait pas mal d'avoir ce tuto complet aussi sur xivo.

Bref , il te manque a priori juste comment refaire le dial d'une interconnection identifiée/crée dans le gui xivo dans un dialplan externe/ecrit par toi à xivo. ( equivalent de la macro dialout-trunk de freepbx ).
Quuuuiiiiinnnnnntaaaaanaaaaaa......
Francois.

daffscat
24/04/2015, 19h27
Hey hey hey! Merci infiniment fastm3!

Plus d'excuse alors ! Je ressors mon petit XIVO ce Week end et j'essaye toutes ces pistes pour trouver une solution.
J'avoue avoir craqué, un peu, et essayé une install de FreePBX... juste pour voir le script fonctionner!

Et oui, si Quintana traîne par ci et surtout par là, je suis ouvert à toute sagesse d'un Guru de XIVO.

Merci pour toutes ces précisions. Je ferai remonter la démarche (si je la trouve). Cela pourra certainement profiter à quelqu'un...

quintana
25/04/2015, 13h31
Salut,

Ok je vais essayer de tester la semaine prochaine et je vous ferez un retour de comment faire.

++

daffscat
27/04/2015, 00h18
C'est la "magie du Libre" et des passionnés de leur art !

Question posée il y a 2 jours, et fastm3, son auteur, vient à mon secours dans l'instant ! Et voici que "quintana", Guru ès XIVO, accours également !. :ouimaitre:

Si un jour j'erre dans les ténèbres, nul besoin d'appeler mon maître, je vous appelle direct les gars (désolé pour la familiarité).

J'espère pouvoir apporter ma petite contribution.
Quintana, puis je te contacter sur le #xivo (IRC) ou mp pour t'envoyer (ou discuter) le script modifié de fastm3 pour coller à postgreeSQL ?

++ Merci ++

quintana
27/04/2015, 01h15
Salut,

Oui avec plaisir, sur freenode #xivo, par contre j'y suis pas en permanence ;-)
Mais au pire y en a aussi qui pourront te répondre ou alors ils me diront que tu me cherches.

++

Dav57
06/12/2015, 10h33
Bonjour,
avec une ligne analogique FT, une box SFR et une box OVH, ce tuto m’intéresse également pour choisir les forfaits dispos.
C'est finalement envisageable cette utilisation sous Xivo ?
Cordialement,
David.

daffscat
07/12/2015, 13h07
Salut Dav57,

J'ai du abandonner ce projet dans les derniers mois donc je n'ai pas plus avancé...Je me suis épuisé à jongler entre l'interface graphique de XIVO et le bon vieux code ... sans succès.

Je me suis libéré un peu de temps cette semaine pour m'y replonger dedans. Je ferai un retour ici.

Le mieux pour nous aiguiller serait le maître Quintana ! Il est tellement sollicité qu'il faudrait lancer un crow funding pour demander son clonage :D

Help Quintana !

Dav57
09/12/2015, 08h02
Salut,
A plusieurs, on devrait peut-être arriver à faire avancer le schmilblick !

daffscat
11/12/2015, 21h17
Bonjour,

J'ai réussi à faire fonctionner mon script modifié sous XIVO. Je suis reparti sur une configuration vierge et ça a fonctionné...

j'ai un soucis quand le premier trunk est saturé. Au lieu de passer au second trunk, je me retrouve avec un message d'erreur. J'ai du oublier une configuration qq part.

Du coup, je vais dans les prochains jours "nettoyer" l'adaptation du script de fastm3 avec des instructions claires pour le faire tourner sur XIVO.

fastm3
12/12/2015, 12h52
Bonjour,

J'ai réussi à faire fonctionner mon script modifié sous XIVO. Je suis reparti sur une configuration vierge et ça a fonctionné...

j'ai un soucis quand le premier trunk est saturé. Au lieu de passer au second trunk, je me retrouve avec un message d'erreur. J'ai du oublier une configuration qq part.

Du coup, je vais dans les prochains jours "nettoyer" l'adaptation du script de fastm3 avec des instructions claires pour le faire tourner sur XIVO.

Pas trop le temps de vous aider en ce moment mais je suis ca avec interet. C'est le genre d'integration que je ne sais pas faire avec Xivo faute de pratique suffisante avec celui-ci.
Cheers !
Francois.

fastm3
12/12/2015, 13h11
je vois que tu as forké. C'est fait pour ca...

Par contre
C'est bien

SELECT trunk, count(number) as mycount FROM ovhcalls group by trunk order by mycount
et non

SELECT trunk, count($number) as mycount FROM ovhcalls group by trunk order by mycount

L'idée est au debut du script de mettre deja une liste de trunks a utiliser du moins frequemment utilisé au plus quelque soit le numero passé.
Si on passe un nouveau numero, on utilisera alors bien le trunk le moins utilisé en resultat.

Ca sera pas le cas dans ta version IMHO.
Francois.

daffscat
12/12/2015, 17h46
Bonjour Fastm3 !!!

Un plaisir de te revoir.

Merci!, oui une erreur de ma part! J'ai rectifié et rajouté les instructions sous GitHub pour l'utiliser sous XIVO.

Je l'ai mis en ligne ici : https://github.com/daffscat/distributed-trunk-agi/blob/master/ovh-versfixes-trunks.pl