PDA

Voir la version complète : Xivo : modification des macros



Ctc74
21/12/2010, 10h54
Bonjour,

Voici mon soucis, je voudrais modifier la macro générale user dans le dialplan de Xivo, ne rien supprimer, mais seulement ajouter quelques lignes, qui viennent s'insérer dans la macro, pour compléter ce que je veux faire.

Or après une mise à jour, j'ai perdu tout ce que j'avais écrit. Il y a t-il un moyen que ce fichier ne soit pas modifié ? ou alors existe t-il une autre méthode, pour ne pas toucher à ce fichier ?

Thanks :)

cedricscha
21/12/2010, 11h52
Que souhaite tu faire ? explique ton besoin, car tu as plusieurs endroit ou mettre des fonctions "avancées", comme par exemple, les templates de contextes, les Sous-routine de prétraitement .....

Ctc74
21/12/2010, 12h12
Je vais prendre le cas de la macro groupmember.

Je souhaite mettre en quelques sortes des permissions sur les groupes d'appel, je rentre les utilisateurs autorisés à entrer dans un groupe d'appel dans asterDB et ensuite je vais vérifier que l'utilisateur est bien autorisé à y entrer.
==> ajout de quelques lignes dans la macro pour vérifier celà, juste avant que l'utilisateur soit ajouté dans le groupe d'appel (execution de la ligne addQueueMember).

Donc voilà, je ne sais si il existe une méthode plus propre de faire celà. :gratgrat:

quintana
21/12/2010, 14h04
Les sous routines sont faites pour cela justement. Donnes moi plus d'infos car j'ai pas bien compris ce que tu voulais.

Ctc74
21/12/2010, 14h26
En fait je veux tout simplement resteindre la possibilité de rejoindre un groupe d'appel aux seules personnes que j'autoriserais.

Dans un premier temps je rentre dans asterDB les utilisateurs qui auront ce droit, pour un groupe donné:
groupe1 n°utilisateur1 oui
groupe1 n°utilisateur2 oui
...

Ma modification de la macro groupmember, va permettre de vérifier si l'association groupe/utilisateur est bien présente dans asterDB, avant d'inscrire le membre dans le groupe.
Si oui l'utilisateur(membre) est bien autorisé, donc on execute la suite de la macro (QueueAddMember ...).
Sinon l'utilisateur n'est pas autorisé.

Cette procédure sera effectuée chaque fois, que par exemple un utilisateur tente de rejoindre un groupe. (utilisation du raccourci téléphonique pour ajouter un membre dans un groupe).

J'espère avoir été un peu plus clair.

En quoi consiste précisément les sous-routine ? comment les utiliser ?

cedricscha
21/12/2010, 15h14
Si je ne me trompe pas, quintana me corrigera au cas ou ;)

la sous routine, fais un Gosub dans un contexte que tu auras crées, il fais donc un ecart du dialplan pour y revenir

au lieu de faire 1 ==> 2

tu fais 1 ==> Sous routine 1, Sous routine 2, sous routine n ==> 2

pour les utiliser, rien de plus simple, tu fais dans un contexte test par exemple ton diallan avec l'extension s, puis tu fini par un return ()

ensuite tu mais dans la page de configuration concerne sous sous routine le mot test.

voici un exemple de sous routine :


[test]
exten = s,1,NoOp(Ma sous routine)
exten = s,n,Return()

Ctc74
21/12/2010, 15h34
Ok je vois ce que tu veux dire, mais bon dans mon exemple je ne vois pas trop dans quel fichier de configuration placer cette sous-routine.
D'autant plus si par exemple j'ai différentes sous-routine à executer, à des moments bien précis dans le dialplan. Sans modifier la marco en elle même je ne vois pas bien comment réaliser celà.

Si quintanta peut éclaircir la situation ... :)

quintana
21/12/2010, 17h02
Ok cela tombe bien car j'avais mis en plus sur cette fonctionnalité, une sous routine qui s'appelle xivo-subrfeatures-groupmember dont la définition est dans /etc/asterisk/xivo_globals.conf.

Donc dans ton cas tu as juste besoin par exemple de faire un fichier de configuration groupmember.conf dans l'interface web ou sinon sur la machine dans /etc/asterisk/extensions_extra.d, attention aux droits !

En gros dans le fichier tu fais un truc du genre :

[xivo-subrfeatures-groupmember]
exten = s,1,NoOp(ma sous routine pour ajout membre)
<mon_code_ici>
exten = s,n,Return()

Puis tu fais un dialplan reload ou recharger asterisk dans l'interface web.

Cela permet de faire un appel à a sous routine juste avant le AddQueueMember fourni dans le dialplan de XiVO.

Après tu peux aussi très bien faire ton propre bout de dialplan séparé.

La sous routine est un hook dans notre dialplan. Dans ton cas si la personne n'est pas authorisé, fini par un Hangup() car sinon cela va revenir dans le dialplan.

J'espère avoir été assez clair.

Tu as aussi de l'info ici :

https://wiki.xivo.fr/index.php/XiVO_1.0-Dalek/Dialplan_Customization

Ctc74
22/12/2010, 11h23
Merci de toutes ces explications :wink:

J'ai pu réaliser ce que je souhaitais, et tout fonctionne correctement :)

Mais j'ai une autre question sur le même sujet.

Pour en revenir à la macro user, imaginons que je veuille effectuer un traitement avant un appel (avant le DIAL) et un autre après (en gros insérer le code qui m'intéresse après le DIAL à la suite d'un NOANSWER par exemple).

Dans ce cas les sous-routines ne sont plus adaptées, n'est-ce pas ? J'ai vu que l'article que tu m'a donné en lien sur le wiki, parle de ca dans la section personnalisé, mais je n'ai pas tout saisi.

quintana
22/12/2010, 13h52
Pour avant tu as la sous routine et pour après tu as directement dans l'interface web sur non réponse que tu peux choisir une action ou un personnalisé.

Ctc74
10/01/2011, 10h46
Pour en revenir à ce sujet, concernant la macro user.
Je n'ai pas vu de sous-routine définit préalablement comme le XIVO_GROUP_MEMBER_SUBROUTINE dans la macro group.
Donc quelle sous-routine utiliser avant l'appel ?
J'ai vu qu'on peut en créer mais dans ce cas, elles ne concernent que :
* Les appels entrant
* Les chambres de conférence
* Les files d'attente
* Les utilisateurs
* Les groupes
Or j'ai envie que ce soit fait de manière globale, et ne pas avoir à repasser sur chaque utilisateur pour indiquer la sous-routine à utiliser si c'est possible.

Ctc74
12/01/2011, 17h01
Je vais détailler un peu plus ce que je souhaite faire. Ici j'ai besoin de modifier la macro extensions_lib_user pour faire des renvois d'appels (qui colle avec un script php qui a été développé pour permettre à un utilisateur de choisir son type de renvoi).
Il existe peut être une façon plus simple de faire ce que je vais détailler, mais je souhaite rester dans un premier temps sur de l'intégration.

Donc dans la macro user, j'execute le code suivant juste avant la ligne:
exten = s,n,GotoIf($[${GROUP_COUNT(${XIVO_DSTID}@XIVO_USER)} >= ${XIVO_SIMULTCALLS}]?BUSY,1)

; do not disturb forward in any case
exten = s,n,Set(num_to_forward_dnd=${DB(DND/${XIVO_DSTNUM})})
exten = s,n,GotoIf($["${num_to_forward_dnd}" = "YES"]?DND,1:nodnd)
exten = s,n(nodnd),NoOp

;call forward unconditionnal
exten = s,n,Set(num_to_forward_cf=${DB(CF/${XIVO_DSTNUM})})
exten = s,n,GotoIf(${num_to_forward_cf}?cf:nocf)
exten = s,n(nocf),NoOp

; forward if busy (instead of waiting for voicemail, forward it to a number specified)
exten = s,n,Set(num_to_forward_cfb=${DB(CFB/${XIVO_DSTNUM})})
exten = s,n,GotoIf($[ $["${GROUP_COUNT(${XIVO_DSTID}@XIVO_USER)}" >= "1"] & $["${num_to_forward_cfb}" != ""] ]?cfb:nocfb)
exten = s,n(nocfb),NoOp


Après :

exten = s,n,Goto(${DIALSTATUS},1)
exten = s,n,MacroExit()

J'ai:

;call forward unconditionnal
exten = s,n(cf),Playback(find-user)
exten = s,n(cf),Set(num=${REGEX("^0[67].*$" ${num_to_forward_cf})})
exten = s,n(cf),GotoIf($["${num}" = "1"]?cf1:cf2)
exten = s,n(cf1),Dial(CAPI/ISDN1/${num_to_forward_cf}/d)
exten = s,n(cf2),Dial(SIP/${num_to_forward_cf},20,tT)
exten = s,n,Goto(voicemail,1)

;call forward busy
exten = s,n(cfb),Playback(find-user)
exten = s,n(cfb),Set(num=${REGEX("^0[67].*$" ${num_to_forward_cfb})})
exten = s,n(cfb),GotoIf($["${num}" = "1"]?cfb1:cfb2)
exten = s,n(cfb1),Dial(CAPI/ISDN1/${num_to_forward_cfb}/d)
exten = s,n(cfb2),Dial(SIP/${num_to_forward_cfb},20,tT)
exten = s,n,Goto(voicemail,1)

;call forward unavailable
exten = NOANSWER,n,Set(num_to_forward_cfu=${DB(CFU/${XIVO_DSTNUM})})
exten = NOANSWER,n,GotoIf(${num_to_forward_cfu}?cfu:nocfu)
exten = NOANSWER,n(cfu),Playback(find-user)
exten = NOANSWER,n(cfu),Set(num=${REGEX("^0[67].*$" ${num_to_forward_cfu})})
exten = NOANSWER,n(cfu),GotoIf($["${num}" = "1"]?cfu1:cfu2)
exten = NOANSWER,n(cfu1),Dial(CAPI/ISDN1/${num_to_forward_cfu}/d)
exten = NOANSWER,n(cfu2),Dial(SIP/${num_to_forward_cfu},20,tT)
exten = NOANSWER,n(cfu2),Goto(voicemail,1)
exten = NOANSWER,n(nocfu),NoOp

J'ai essayé de déninir une sous-routine XIVO_USERPREPROCESS_SUBROUTINE = fwd-user-one sans succès.
Je voudrais avoir quelques pistes pour qu'à la prochaine mise à jour, tout ne part pas...