Cursos Asterisk en México

Mi primer perl AGI script

Colapsar

Anuncio

Colapsar
No hay anuncio todavía.
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Mi primer perl AGI script

    Hola apañeros,

    Estoy intentando hacer un pequeño script muy sencillote. La idea es pasarle el accountcode y desde el script que pida un pin y que te valide si puedes u no continuar.

    Mi poblema es que no soy capaz de sacar el número de extensión del llamante.

    A ver como se haría:

    #!/usr/bin/perl

    use Asterisk::AGI
    $AGI = new Asterisk::AGI;

    my %input = $AGI->ReadParse();

    $AGI->verbose("Entrada " . $pin_entry . " para " . $input{'accountcode'});

    Pero no saca nada. He intentado pasarselo como parametro desde el dialplan:

    exten => 207,1,agi,pin.agi,${ACCOUNTCODE}

    $AGI->verbose("Entrada " . $pin_entry . " para " . $ARGV["0"]);

    Y nada, la cosa que en este del parámetro da igual lo que ponga que el ARGV no lo pilla.

    ??? pffff vaya primer intento, si alguien me pudiera echar un cable para superar este pequeño gran bache

  • #2
    Mi primer perl AGI script

    requieres que este account code y pin lo compare con una base de datos?

    Comentario


    • #3
      Bueno eso de la BBDD ya es para nota. De momento me conformo con poder hacer una comparación con un número estático.

      Algo como llamar a la función get_pin($accountcode) y que de el pin correcto. Al principio lo haría con un return 1234; por ejemplo y cuando esté funcionando ya conectaremos con la BBDD.

      Comentario


      • #4
        Ya casi me funciona aunque hay algo que me trae mosca.

        La llamada desde extensions.conf:
        exten => 207,1,SetLanguage(es)
        exten => 207,2,SetVar(Valid=0)
        exten => 207,3,SetVar(Attempts=0)
        exten => 207,4,AGI(pin.agi,${CALLERIDNUM})
        exten => 207,5,GotoIf(${Valid} = 1? 21 : 6)
        ;exten => 207,6,SetVar(Attempts=${Attempts} + 1) ; Spaces are needed!
        exten => 207,6,GotoIf(${Attempts} >= 3 ? 7 : 4)
        exten => 207,7,Playback(vm-goodbye)
        exten => 207,8,Hangup

        exten => 207,21,MusicOnHold()


        El script AGI, muy sencillito:
        my ($text)=@ARGV;

        $AGI->verbose($text);
        $pin_entry = $AGI->get_data('pin-number', 15000, 4);

        #$pin_user = get_pin( $text );
        $pin_user = 1234;

        $attempts = $AGI->get_variable('Attempts');
        $AGI->set_variable('Attempts', $attempts + 1);

        if ( $pin_entry == $pin_user ) {
        $AGI->verbose("biennn");
        $AGI->set_variable('Valid','1');
        } else {
        $AGI->set_variable('Valid','0');
        }

        El tema es que ${Attempts} en perl me lo pilla como numérico por lo que soy capaz de incrementar, mientras que en el dialplan me lo pilla con tipo de cadena de caracteres y no es capaz de hacer bien la comparación por lo que solamente me da un intento :?

        Si el incremento de ${Attempts} lo hago en el dialplan con SetVar( Attempts = ${Attempts} + 1 ) también me lo trata como string y lo que hace es concatenar el 1 en lugar de sumar.

        ¿Qué puede estar pasando?

        Comentario


        • #5
          pin.agi

          Y al final lo conseguí, mi primer script AGI funcionando jejeje estoy muuuuyyyyyy contento

          Os cuento lo que hace y como lo hace. La historia es una especie de sustituto del Authenticate que tire de nuestra BBDD, con sus tres reintentos incluidos.

          El dialplan queda de la siguiente forma:
          exten => 207,1,SetLanguage(es)
          exten => 207,2,SetVar(Valid=0)
          exten => 207,3,SetVar(Attempts=0)
          exten => 207,4,AGI(pin.agi,${CALLERIDNUM})
          exten => 207,5,GotoIf(${Valid} = 1? 21 : 6)
          exten => 207,6,SetVar(Attempts=$[${Attempts} + 1])
          exten => 207,7,GotoIf( $[${Attempts} >= 3] ? 8 : 4)
          exten => 207,8,Playback(vm-goodbye)
          exten => 207,9,Hangup

          exten => 207,21,MusicOnHold()

          ¿Porqué me trataba como string anteriormente el contenido de las variables? Pos porque lo que estamos tratando son expresiones y para evaluarlas hay que hacer $[Expresion].

          El AGI pin.agi es muy sencillito:
          #!/usr/bin/perl
          #
          use Asterisk::AGI;
          use DBI;

          $AGI = new Asterisk::AGI;

          my %input = $AGI->ReadParse();
          my ($user)=@ARGV;

          $pin_entry = $AGI->get_data('pin-number', 15000, 4);
          $pin_user = get_pin($user);

          if ( $pin_entry == $pin_user ) {
          $AGI->set_variable('Valid','1');
          } else {
          $AGI->set_variable('Valid','0');
          }

          sub get_pin( $user ) {
          %MYSQL = (
          hostname => "localhost",
          username => "usuario",
          password => "pwd",
          database => "asterisk"
          );

          my $dbh = DBI->connect("dbi:mysql:$MYSQL{database}:$MYSQL{hostna me}","$MYSQL{username}","$MYSQL{password}")
          || die ("No pudo conectar\n");

          my $query = "SELECT pin FROM sipfriends WHERE username=$user";
          my $recordset = $dbh->prepare($query);
          $recordset->execute
          || die ("No pude ejecutar la consulta");
          my $pin = $recordset->fetchrow_hashref;
          return $pin->{pin};
          }

          Notas: Hay que añadir un campo con nombre pin en la tabla sipfriends.

          Y poco más jejeje. Bueno una mejora sería hacer que el grueso del dialplan anterior fuera en una Macro, si alguien se anima

          Comentario


          • #6
            pin.agi

            Hombre.. que bueno que ya pudiste a penas me disponia a apoyarte.. .pero ya lo hiciste.. eso es lo mejor...

            SAludos , en horabuena...

            Comentario


            • #7
              pin.agi

              Estuvo excelente, tu agi solo hace lo que requieres y todo lo manejas desde el dialpan, eso de medir la cantidad de intentos estuvo muy bien!

              Comentario


              • #8
                Gracias, la verdad que la idea de contar los intentos la vi por el wiki anque luego tuve que darle un pequeño toque y porque me dio por leer el documento README.variables . Muchas veces las cosas están donde menos las esperamos.

                Estos días de pogramación con el AGI me están ayudando a ver la luz y comprender muchas cosas del Asterisk.

                Lo que si estaría bien es generalizar ese pequeño Dialplan y meterlo en una macro, de esa forma se podría usar el AGI-Authenticate para las extensiones que necesitemos facilmente y sin tener que escribir tanto

                Comentario

                Principales Usuarios Activos

                Colapsar

                No hay usuarios activos superiores.
                Trabajando...
                X