PDA

Voir la version complète : Asterisk et phpAgi



lilibess
19/08/2015, 14h15
Bonjour je suis nouvelle dans l'environnement asterisk ou du moins j'ai pas trop de connaissances la dessus. Je voudrais installer phpAgi sur centos. J'ai

déjà téléchargé le phpAgi-2.20 mais je sais pas comment m'y prendre.

Votre aide me sera d'une grande importance merci d'avance !

tanguyd
20/08/2015, 12h53
Bonjour

Peux tu présenter le contexte ? Utilise tu un asterisk seul, ou combiné avec des interfaces comme freepbx ou xivio ?

Quels genre d'agi veut tu utiliser ? Pour développer un "serveur vocal", pour effectuer des traitements spécifiques avant un appel ?

lilibess
20/08/2015, 13h37
J'utilise asterisk seul du 1.8. En fait je suis sur un projet le but est de créer une application web qui interagit avec asterisk celui ci permettra d'effectuer des appels et d'en recevoir aussi. Du coup jai crée une base de donnée contenant une table postes('id','nom_poste','numero','mot_pass') , donc au moment de l'appel je dois verifier dans la base si le numero de l'appelant existe dans la base si oui je décroche sinon on rejette l'appel.

Voilà en gros

tanguyd
20/08/2015, 14h06
De mémoire l'installation de php agi ne consistait qu'a copier le fichier phpagi.php dans le répertoire en fonction de la conf asterisk ( par exemple /var/lib/asterisk/agi-bin/ ) de déposer ton script dans le même répertoire.

Pour ton besoin, je ne pense pas qu'il indispensable de passer par agi, il est aussi possible de passer en dialplan avec des fonctions if est shell exec.

Si tu en a la possibilité, je te conseille essayer une distribution avec freepbx ( comme elastix ) car elle utilise phpagi. Ca te permettrais d'étudier un exemple fonctionnel avec phpagi.

lilibess
20/08/2015, 14h16
Je penses je serai plus à l'aise avec le phpagi vu que l'appli je l'ai faite avec du php. As tu une fois utilisé du phpagi avec une base de donnée si oui, pourrais-je avoir un exemple de code, j'en ai vraiment besoin comme je te l'ai dit je m'y connais pas trop en phpagi

Merci d'avance

tanguyd
20/08/2015, 18h02
Pour ton cas j'aurais imaginé quelque chose inspiré de cette url

https://www.muchtall.com/2012/05/23/whitelisting-incoming-calls-on-asterisk/

[macro-inbound-whitelist]
exten => s,2,RESULT=${SHELL(/scripts/verif_numero.sh ${CALLERID(num}) )
exten => s,1,GotoIf(RESULT="1")}?:blacklisted,s,1)
exten => s,2,Dial(${ARG1})

Et on suppose que le script /scripts/verif_numero.sh contient un appel a la base mysql et renvoie 0 si c'est OK, 1 si le numéro est inconnu.

Si tu veux le faire en AGI, je pense que c'est possible aussi.

Pour l'exemple de code, cela dépend ce que tu cherches, je pense que le mieux est de prendre les codes d’exemples officiels.
http://sourceforge.net/projects/phpagi/files/phpagi/2.20/

Une fois que tu arrives à executer toi même l'un de ces codes, tu sais que phpagi est fonctionnel sur ton serveur et tu peux commencer a développer.

Il n'y pas énormément de docs sur les fonction AGI de phpagi, mais cherche les fonctions agi en perl, elles sont identiques.

lilibess
20/08/2015, 19h19
Merci pour ton aide en suivant ton conseil j'ai chercher toute la journée sur le net et j'ai pu trouver quelques réponses. En fait j'ai un autre soucis quand j'essaie d'executer un script php le CLI d'asterisk me souligne une erreur :

Executing [100@gerer:1] AGI("SIP/102-00000003", "test.php,102>") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/test.php
-- <SIP/102-00000003>AGI Script test.php completed, returning 0
-- Executing [100@gerer:2] Set("SIP/102-00000003", "__Identfiant=") in new stack
-- Executing [100@gerer:3] NoOp("SIP/102-00000003", ""C'est un test d'affichage variable ") in new stack
-- Auto fallthrough, channel 'SIP/102-00000003' status is 'UNKNOWN'

Voici mon Dialplan

[Test]
exten => 100,1,agi(test.php,${CALLERID(num)})
exten => s,n,WaitExten(5)
exten => 100,2,Set(__Identfiant=${Identifiant})
exten => 100,3,noop("C'est un test d'affichage variable ${Identifiant})



Voici le script php: test.php

#!/usr/bin/php -q
<?php
REQUIRE("phpagi-2.20/phpagi.php");
///inclusion du framework de phpagi
INCLUDE("database.php");
///inclusion de mes infos sql
$agi = new AGI();
///création d'un nouvel objet agi
$Num = $_SERVER['argv'][1];
///Récupération de la valeur de ma première variable passée en paramètre


///$Num= preg_replace("#[^0-9]#","",$agi->request[agi_callerid]);
IF(STRLEN($Num)>=3):
$REQSelection = "SELECT nom_poste FROM postes WHERE numero LIKE '%$Num%'";
$RESSelection = MYSQL_QUERY($REQSelection);
IF(MYSQL_NUM_ROWS($RESSelection)==1):
$Identifiant = MYSQL_RESULT($RESSelection);
ELSE:
$Identifiant = UTF8_DECODE(CHUNK_SPLIT($Num,2," ").' non présent dans la base de donnée');
ENDIF;
ELSE:
$Identifiant = UTF8_DECODE(CHUNK_SPLIT($Num,2," ").' non présent dans la base de donnée');
ENDIF;
$agi->set_variable("Identifiant", $Identifiant);
///Renvoi du résultat à la variable identifiant de mon dialplan

?>


Est-ce qu'on doit écrire un context au niveau du fichier sip.conf du diaplan correspondant quand on utilise phpagi ?

tanguyd
20/08/2015, 21h16
As tu essayé d’exécuter son script a la main ? A la main, il faut appuyer sur entrée une fois le script lancé, il va t'afficher ce qu'il renvoie a l'asterisk

Je viens d'essayer ton script a la main: forcement ça plante car j'ai pas les includes, mais j'ai comme toi AGI Script test.php completed, returning 0 dans l'asterisk.

# php /var/lib/asterisk/agi-bin/test.php
PHP Warning: require(phpagi-2.20/phpagi.php): failed to open stream: No such file or directory in /var/lib/asterisk/agi-bin/test.php on line 3
PHP Fatal error: require(): Failed opening required 'phpagi-2.20/phpagi.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/lib/asterisk/agi-bin/test.php on line 3

Par contre si je change les includes et que je force le set_variable ( car je n'ai pas le reste de ta base ) , c'est mieux vision asterisk

== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Executing [100@from-internal:1] AGI("SIP/5002-00003ec7", "test.php,5002") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/test.php
-- <SIP/5002-00003ec7>AGI Script test.php completed, returning 0
-- Executing [100@from-internal:2] WaitExten("SIP/5002-00003ec7", "5") in new stack
-- Timeout on SIP/5002-00003ec7, continuing...
-- Executing [100@from-internal:3] NoOp("SIP/5002-00003ec7", ""C'est un test d'affichage variable test 5002") in new stack

lilibess
21/08/2015, 11h57
ok, mais comment exécuter le script à la main ? parceque quand j'appelle le 100 le script se lance de façon automatique

tanguyd
21/08/2015, 12h10
Tout simplement en lignes de commandes comme dans mon exemple ( et tu fait entrée, une fois script en cours, il doit d'atticher un truc du genre set variable = valeur )

php /var/lib/asterisk/agi-bin/test.php Numero


Ce n'est pas un test complet, mais déjà ça permet de voir une éventuelle erreur php

lilibess
21/08/2015, 12h26
Est-ce qu'il y a des paquets à installer parceque quand je fais comme t'as dit rien ne s'affiche le curseur ne fait que clignoter

lilibess
21/08/2015, 12h29
est-ce qu'il y a des paquets php à installer parceque si je fais comme t'as dit rien ne s'affiche le curseur ne fait que clignoter

tanguyd
21/08/2015, 12h31
il fois lancé tu appuie a nouveau sur entrée

lilibess
21/08/2015, 12h35
Il m'affiche ça : VERBOSE "AGI Request:" 1

tanguyd
21/08/2015, 12h47
Ok, je vais essayer de te confirmer ce soir, mais il me semble bien que ça m'affichait un truc du genre "agi set variable"

Il t'a rendu la main ?

Je ne me souviens pas si il faut faire un entrée par appel de fonctions AGI

lilibess
21/08/2015, 12h54
D'accord pas de soucis, nono je ne crois pas il ne m'affiche que ça en fait

lilibess
21/08/2015, 13h02
Une autre question stp, comment t'as fait l'execution pour avoir ça, là on voit bien que la variable $Identifiant a été retourné, t'as appelé le numéro 100 pour l'avoir :

== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Executing [100@from-internal:1] AGI("SIP/5002-00003ec7", "test.php,5002") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/test.php
-- <SIP/5002-00003ec7>AGI Script test.php completed, returning 0
-- Executing [100@from-internal:2] WaitExten("SIP/5002-00003ec7", "5") in new stack
-- Timeout on SIP/5002-00003ec7, continuing...
-- Executing [100@from-internal:3] NoOp("SIP/5002-00003ec7", ""C'est un test d'affichage variable test 5002") in new stack

tanguyd
21/08/2015, 22h50
J'ai rien inventé par rapport a ce que tu a mis, au contraire j'en ai plutôt retiré des lignes dans le fichier php

J'ai utilisé ton bout de dialplan et récupéré ton code sur lequel je n'ai gardé que ce qui concerne agi


#!/usr/bin/php -q
<?php

REQUIRE("phpagi.php");
$agi = new AGI();
///création d'un nouvel objet agi
$Num = $_SERVER['argv'][1];
$agi->set_variable("Identifiant", "test $Num" ) ;

?>


et je confirme le résultat chez moi


# php test.php 5002

SET VARIABLE Identifiant "test 5002"