• Solution pour alternance trunk "smart"

      Pas toujours evident de trouver des idees de tutorial "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 utilser 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 toujurs la meme ligne illimité pour un meme 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 gere tres mal et en fonction de l'usage. On risque tres 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 ( depassement de 100 numeros sur une ligne "illimité" )


      Je joins un agi "exemple" pour optimiser n lignes limité à 100 numeros tels que les lignes chez OVH par exemple. Cela pourrait etre utiliser egameùent avec des gateways de mobiles ou les operateurs ont le meme 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 necessaires. On pourra utiliser la base asterisk deja utilisé par freepbx par exemple.

      Voici le sql à exécuter:
      Code:
      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 meme ligne que precedemment. Le script veillera en meme temps a ce que toutes les lignes "illimités" soient uniformement 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 maniere:
      Code:
      /var/lib/asterisk/agi-bin# ./ovh-versfixes-trunks.pl test 0102030405
      On doit avoir en retour les numeros de trunks dans l'ordre le plus optimisé. On pourra verifier qu'un meme numero retourne par exemple toujours le meme 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.
      Cet article a été publié à l'origine dans la discussion du forum : Solution pour alternance trunk "smart" commencé(e) par fastm3 Afficher le message original
      Commentaires 14 Commentaires
      1. Avatar de _AK_
        _AK_ -
        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!
      1. Avatar de daffscat
        daffscat -
        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 !
      1. Avatar de fastm3
        fastm3 -
        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.
      1. Avatar de daffscat
        daffscat -
        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...
      1. Avatar de quintana
        quintana -
        Salut,

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

        ++
      1. Avatar de daffscat
        daffscat -
        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 !.

        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 ++
      1. Avatar de quintana
        quintana -
        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.

        ++
      1. Avatar de Dav57
        Dav57 -
        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.
      1. Avatar de daffscat
        daffscat -
        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

        Help Quintana !
      1. Avatar de Dav57
        Dav57 -
        Salut,
        A plusieurs, on devrait peut-être arriver à faire avancer le schmilblick !
      1. Avatar de daffscat
        daffscat -
        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.
      1. Avatar de fastm3
        fastm3 -
        Citation Envoyé par daffscat Voir le message
        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.
      1. Avatar de fastm3
        fastm3 -
        je vois que tu as forké. C'est fait pour ca...

        Par contre
        C'est bien
        Code:
        SELECT trunk, count(number) as mycount FROM ovhcalls group by trunk order by mycount
        et non
        Code:
        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.
      1. Avatar de daffscat
        daffscat -
        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/distribu...ixes-trunks.pl
    • A propos d'Asterisk

      Asterisk

      Asterisk est un IPBX open source (logiciel libre) pour Linux originellement créé en 1999 par Mark Spencer, fondateur de la société Digium.

      logo asterisk
    • Downloads populaires

    • Articles récents

    • Utilisateurs actuellement connectésUtilisateurs actuellement connectés

      0 membre(s) et 21 invité(s)

      Le record de connectés est de 2 678, 22/07/2022 à 11h34.

    • Ils nous soutiennent

      logo digium
      logo alter-it
      logo avencall
      logo beronet
      logo celya
      logo cnsi
      logo dolmen
      logo easypyro
      logo eyepea
      logo keyyo
      logo opcom
      logo openip
      logo ovh
      logo qualigaz
      qualistream
      logo voip-asterisk
      logo voxity
      logo yealink