IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Problème avec Socket et/ou Telnet sur le manager d'Asterisk


Sujet :

Programmation et administration système Perl

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème avec Socket et/ou Telnet sur le manager d'Asterisk
    Bonjour,

    Je cherche à ecrire un script Perl se connectant au manager API d'Asterisk. On s'y connecte "humainement" avet un simple telnet sur le port 5038. Ensuite on peut envoyer des commandes à Asterisk qui se présentent sous cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    action: clogin\n
    username: office\n
    secret: welcome\n
    \n
    et lui même nous envoie des élément de la même forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Event: PeerStatus
    Privilege: system,all
    Peer: SIP/103
    PeerStatus: Registered
    Mon but est de me coonecter à cet API et évidemment de pouvoir envoyer et recevoir ces différents bloc. J'ai commencé par utiliser une connexion Telnet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/perl -w
    use Net::Telnet ();
    #Variables de connexion
    $USER='offi';
    $SECRET='*****';
    $SERVER_IP='10.0.0.1';
     
    #initialisation de la connection Telnet au manager d asterisk
    $tn = new Net::Telnet (
    Port => 5038,
    Prompt => '/.*[\$%#>] $/',
    Output_record_separator => '',
    Errmode => 'return',
    Telnetmode => 'off'
    );
     
    sub connectAM{
    #connection
    $tn->open("$SERVER_IP");
    $tn->waitfor('/0\n$/');
    #log
    $tn->print("Action: Login\nUsername: $USER\nSecret: $SECRET\n\n");
    $tn->waitfor('/Authentication accept*/')
    or die "Asterisk Manager Interface login failed, verify username and password: ", $tn->lastline;
    }
     
    sub deconnectAM{
    $tn->print("Action: Logoff\n\n");
    }
     
    sub listeExten{
    $tn->print("Action: command\ncommand: sip show peers\n\n");
    @z = $tn->getlines(Timeout => 2);
    for($i=0;$i<$#z;$i++){
    print "$z[$i]\n";
    }
    #print "$e\n";
    }
     
    connectAM();
    print "Connexion effectuee\n";
    listeExten();
    deconnectAM();
    J'arrive à créer la connection et à me logger malheuresement je n'arrive pas à récupérer le contenu du buffer Telnet. En désespoir de cause je me suis tourné ver les sockets pour essayer de résoudre mon problème (solution qui a maintenant techniquement ma préférence). J'arrive bien à me connecter sur le port car je récupère le message d'accueil. Mais manifestement je n'arrive pas à envoyer de données sur le socket car ensuite je ne récupère jamais rien :'(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl -w
    use LWP::Socket;
     
    $socket = new LWP::Socket;
    $socket->connect('10.0.0.1', 5038); # echo
    $socket->read(\$buffer);
    print \$buffer."\n";
     
    $quote = "action: login\nusername: office\nsecret: welcome\n\n";
    $socket->write($quote);
    $socket->read(\$buf);
    print $buf."\n";
     
    $socket = undef; # close
    J'ai bien sûr testé avec IO::Socket et IO::Socket::INET mais même résultat...

    Pour résumer voici ce que j'aimerais faire:
    - Une connection par Socket qui ecoute tout ce que renvoie l'API d'Asterisk (dans le but de stocker dans mysql), et qui nécessite une d'abord une authentification, donc envoie de données (action: login\n ....).
    - Une connection Telnet qui me servirais uniquement à envoyer des commandes (ça j'y arrive déjà)...

    Pour info je programme depuis plusieurs années mais j'ai commencé le Perl cette semaine . Mon code est donc sans aucun doute améliorable.
    Les modules IO::pty et POE::Component::Client::Asterisk::Manager m'ont semblé intéressant mais je n'y ai pas capté grand chose

    Merci d'avance,
    Gorby

  2. #2
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 2
    Points : 3
    Points
    3
    Par défaut La réponse....
    Voici le code qui va bien. C'était mes caractère de retour à la ligne ("\n") qui n'étaient pas bons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/usr/bin/perl
     
    use IO::Socket::INET ;
     
    my $EOL = "\015\012";
    my $BLANK = $EOL x 2;
     
    my $socket = IO::Socket::INET -> new (
    PeerAddr => '10.0.0.1' ,
    PeerPort => 5038 ,
    Proto => 'tcp' ,
    Type => SOCK_STREAM
    );
     
    $socket->autoflush(1);
     
    $socket -> recv ( $message , 128 ) ;
    print $message ;
     
    print $socket "Action: Login${EOL}Username: offi${EOL}Secret: *****$BLANK";
    while(1){
    $socket -> recv ( $message , 128 ) ;
    print $message ;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2008, 20h37
  2. Réponses: 3
    Dernier message: 21/11/2006, 18h59
  3. Réponses: 4
    Dernier message: 15/10/2006, 19h05
  4. Réponses: 8
    Dernier message: 11/10/2006, 18h28
  5. [AJAX] Ajax en mode synchrone sur Safari
    Par The Blec dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/02/2006, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo