Projet

Général

Profil

[Résolu] Enregistrement de 2 trunks chez le même fournisseur - Proposition d'amélioration

Ajouté par Bastien HIRIARTE il y a 11 mois

Bonjour à tous,

Il ne s'agit pas là d'un soucis mais d'une solution, en espérant que cela puisse aider quelqu'un d'autre voir même être intégrée dans les prochaines version de Xivo.

Contexte :
Lors de l'enregistrement de 2 trunks sur le même Xivo vers le même fournisseur, les 2 enregistrements sont fait sous le même nom sous la forme "reg_FQDNfournisseur". PJSIP ne voit alors qu'une "registration" avec 2 identifiant / mot de passe ce qui fait qu'un seul trunk est enregistré et cela de manière aléatoire et donc pose un soucis de réception d'appels.
Il est possible de le voir avec un "pjsip show registrations", vous verrez qu'un seul des 2 trunks n'apparait.

Solution trouvée
Modifier le nom d'enregistrement pour qu'il soit obligatoirement différent pour chaque trunks et ce en se basant sur le nom du trunk renseigné dans l'onglet général et non pas le FQDN du fournisseur ce qui donne reg_nomDuTrunk.
Afin d'être sûr de récupérer le bon nom de trunk, une vérification sur le FQDN du fournisseur + l'identifiant de connexion est faite (le cas où 2 trunks aient les mêmes informations étant impossible).

Solution validée sur
Jabbah (2022.10.05)
Kuma (2023.05.06)

Correction proposée
Tout se passe dans le fichier : /usr/lib/python3/dist-packages/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
Et voici les modifications à apporter en essayant de coller au mieux au style du code (le fichier complet modifié est disponible en PJ) :

ajout -> avec les autres import en début de fichier -> from xivo_dao.resources.endpoint_sip import dao as sip_dao

ajout -> dans la fonction def __init__(...) de la classe Registration -> self.extract_trunk_name()

ajout -> avant la fonction def write(...), la fonction de récupération du nom du trunk (attention à l'indentation)

def extract_trunk_name(self):
    """
    Extract the name of the trunk to set different name for
    all the registration section in pjsip.conf.
    Function used in self.write().
    """
    trunk = sip_dao.find_by(commented=0,
        category='trunk',
        host=self.host,
        username=self.authuser)

    self.trunk_name = trunk.name

modification -> dans la fonction def write(...) -> modifier section = 'reg_' + self.host par section = 'reg_' + self.trunk_name

modification -> dans la fonction def write(...) -> modifier auth_section = 'auth_reg_' + self.host par auth_section = 'auth_reg_' + self.trunk_name

Résultat
Une fois ce correctif appliqué, vous verrez bien vos 2 "registrations" distinctes avec la commande PJSIP et n'aurais plus de soucis d'enregistrement / réception d'appel.

Conclusion
Voilà pour moi, je reste bien sûr ouvert à toute améliorations ou suggestions
Et sinon, bonne continuation à tous avec la VOIP


Réponses (4)

RE: [Résolu] Enregistrement de 2 trunks chez le même fournisseur - Proposition d'amélioration - Ajouté par Laurent MEILLER il y a 11 mois

Merci, en effet cette correction est tout à fait valide, et pourra servir à d'autres !

A voir pour nous pour l'intégrer dans le produit, car même si la modification semble mineur, il faut qu'on repasse une batterie de tests.

En tout cas, encore merci pour cette contribution.

RE: [Résolu] Enregistrement de 2 trunks chez le même fournisseur - Proposition d'amélioration - Ajouté par Antoine TIXIER il y a 2 mois

Bonjour,

Je vais être confronté sous peu à ce cas de figure sous Luna 2023.10.04

L'enregistrement est toujours sous la forme : "reg_FQDNfournisseur"

Merci pour cette contribution qui va me faire gagner un temps précieux

RE: [Résolu] Enregistrement de 2 trunks chez le même fournisseur - Proposition d'amélioration - Ajouté par Antoine TIXIER il y a environ un mois

Sous Maia (docker), je n'ai pas trouvé de moyen simple de le faire durablement, il est monté dans plusieurs conteneurs :

/var/lib/docker/overlay2/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/diff/usr/local/lib/python3.9/site-packages/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/diff/usr/src/confgend/build/lib/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy/diff/usr/src/confgend/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/diff/usr/local/lib/python3.11/site-packages/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/diff/usr/src/confgend/build/lib/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/diff/usr/src/confgend/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py
/var/lib/docker/overlay2/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/merged/usr/local/lib/python3.11/site-packages/xivo_confgen/generators/sip2pjsip/sip_to_pjsip.py

J'ai utilisé une autre méthode, sachant que j'ai deux trunks keyyo,

dans le champ "Serveur distant" de la section "Enregistrement" du second Trunk (utilisé pour générer le nom "reg_keyyo.net"), j'ai saisi "keyyo.fake"

A la génération du pjsip.conf, jobtiens :

Pour le premier trunk :

[reg_keyyo.net]
type = registration

[auth_reg_keyyo.net]
type = auth

Pour le deuxième trunk :

[reg_keyyo.fake]
type = registration

[auth_reg_keyyo.fake]
type = auth

J'ai ensuite utilisé la méthode de surcharge de pjsip.conf via le default.conf (https://docs.asterisk.org/Fundamentals/Asterisk-Configuration/Asterisk-Configuration-Files/Adding-to-an-existing-section/?h=adding)
pour modifier client_uri et serveur_uri

[reg_keyyo.net](+type=registration)
line=yes
endpoint=KEYYO_trunk1

[reg_keyyo.fake](+type=registration)
client_uri=sip:334XXXXXXXX@keyyo.net:5060
server_uri=sip:keyyo.net:5060
line=yes
endpoint=KEYYO_trunk2

Pour le routage des appels entrants vers le bon endpoint, j'ai dû ajouter l'option "line"

https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Configuring-Outbound-Registrations/
https://www.asterisk.org/the-pjsip-outbound-registration-line-option/

Dans l'attente de vos critiques sur cette façon de contourner le problème.

    (1-4/4)