.titleBar { margin-bottom: 5px!important; }

Auf einmal gehen meine AGI-Scripts nicht mehr??

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von divB, 14 Feb. 2007.

  1. divB

    divB Mitglied

    Registriert seit:
    14 Juli 2006
    Beiträge:
    324
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ich habe mir im Sommer einen Asterisk hergerichtet, u.a. mit einem AGI-Script, das CIDLookup auf verschiedene lokale Datenquellen macht.

    Das hat gut funktioniert, auf einmal jedoch nicht mehr. Habe glaub ich seit Sommer nix mehr umgestellt. Jetzt (da ich Zeit habe) geh ich der Sache nach und versteh gar nix mehr: Das AGI-Teil scheint komplett zu spinnen!!

    Hier ein kleiner Ausschnitt aus /usr/share/asterisk/agi-bin/cidlookup.agi:

    Code:
    #!/usr/bin/perl
    
    # print STDERR "Starting CIDLookup, first line\n";
    
    use strict;
    use Asterisk::AGI;
    use DBI;
    
    my $AGI = new Asterisk::AGI;
    
    my %input = $AGI->ReadParse();
    
    print STDERR "Starting CIDLookup...\n";
    
    my $callerid = $input{'callerid'};
    
    my @lookups = (\&personal_sql, \&flat_file);
    
    #Exit quickly if there is already a name in callerid or if the callerid field is empty
    if (!$callerid || $callerid =~ /[A-Za-z]+/) {
            exit(0);
    }
    
    #remove everything non numeric from callerid string
    $callerid =~ s/[^\d]//g;
    
    print STDERR "So, our CID now is: $callerid\n";
    
    foreach my $callback (@lookups)
    {
            if(my $name = &$callback($callerid))
            {
                    my $newcallerid = "\"$name <$callerid>\"";
                    $AGI->set_callerid($newcallerid);
                    last;
            }
    }
    
    sub personal_sql()
    {
            my ($callerid) = @_;
            my $name = '';
    
            print STDERR "Starting SQL backend\n";
    
            my $dbh = DBI->connect('DBI:mysql:asterisk:localhost', 'asterisk', '');
            if(!$dbh)
            {
                    print STDERR "personal_sql: Could not connect to mySQL Server!\n";
                    return '';
            };
    
            my $row = $dbh->selectrow_hashref("SELECT fullname, only_to FROM numbers WHERE number='$callerid'");
    
            if($row)
            {
                    $dbh->disconnect;
    
                    if($row->{'only_to'})
                    {
                            my $only_to = uc($row->{'only_to'});
                            my $call_to = $AGI->get_variable($only_to);
                            if($call_to)
                            {
                                    print STDERR "Route to one destination: $call_to\n";
                                    $AGI->exec('Set', 'RECIPIENT=' . $call_to);
                            }
                    }
    
                    print STDERR "Yeah, found lookop. Name is: " . $row->{'fullname'} . "\n";
    
                    return $row->{'fullname'};
            }
    
            print STDERR "personal_sql: Could not find name for '$callerid'\n";
    
            $dbh->disconnect;
    
            return '';
    }
    
    [...]
    
    Führe ich das auf der Kommandozeile aus, geht alles wie gehabt:

    Code:
    # su asterisk -s /bin/bash -c '/usr/share/asterisk/agi-bin/cidlookup.agi'
    agi_request: cidlookup.agi
    agi_callerid: 012345678
    
    Starting CIDLookup...
    So, our CID now is: 012345678
    Starting SQL backend
    Yeah, found lookop. Name is: Test Person
    SET CALLERID "Test Person <012345678>"
    
    Macht das aber Asterisk (debug=10, verbose=10, agi debug), so wird witzigerweise gar nichts ausgegeben und das ganze funktioniert auch nicht! Zurückgegeben wird auch "0" für "Erfolg"

    Code:
    [...]
     -- Executing NVFaxDetect("CAPI/ISDN1/444444-3", "4|dt") in new stack
    Feb 14 02:06:01 WARNING[26371]: channel.c:1602 ast_waitfor_nandfds: Thread -1223504976 Blocking 'CAPI/ISDN1/444444-3', already blocked by thread 0 in proced
    nobaq*CLI> -- Executing AGI("CAPI/ISDN1/444444-3", "cidlookup.agi") in new stack
    -- Launched AGI Script /usr/share/asterisk/agi-bin/cidlookup.agi
    AGI Tx >> agi_request: cidlookup.agi
    AGI Tx >> agi_channel: CAPI/ISDN1/444444-3
    AGI Tx >> agi_language: de
    AGI Tx >> agi_type: CAPI
    AGI Tx >> agi_uniqueid: asterisk-18476-1171415161.8
    AGI Tx >> agi_callerid: 012345678
    AGI Tx >> agi_calleridname: unknown
    AGI Tx >> agi_callingpres: 3
    AGI Tx >> agi_callingani2: 0
    AGI Tx >> agi_callington: 33
    AGI Tx >> agi_callingtns: 0
    AGI Tx >> agi_dnid: 444444
    AGI Tx >> agi_rdnis: unknown
    AGI Tx >> agi_context: capi-in
    AGI Tx >> agi_extension: 444444
    AGI Tx >> agi_priority: 5
    AGI Tx >> agi_enhanced: 0.0
    AGI Tx >> agi_accountcode: 
    AGI Tx >> 
    nobaq*CLI> -- AGI Script cidlookup.agi completed, returning 0
    -- Executing Macro("CAPI/ISDN1/444444-3", "MyDial|SIP/sip1&Zap/g1/22|17|rtw") in new stack
    [...]
    
    Hat jemand eine Ahnung wos da haken könnte?

    Ich versteh das irgendwie nicht :-(

    Für jeden Tipp dankbar!,

    divB
     
  2. divB

    divB Mitglied

    Registriert seit:
    14 Juli 2006
    Beiträge:
    324
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    [SOLVED] Auf einmal gehen meine AGI-Scripts nicht mehr??

    Problem gelöst.

    Wegen dem schei** chan_skype hatte ich noch im init-Script vor dem Asterisk stehen

    LD_PRELOAD=/usr/local/lib/libfixchanskype.so.1

    Dabei hatte ich vergessen die Permissions zu setzen, d.h. nur root hatte Lesezugriff.

    Krankerweise funktionierte Asterisk einwandfrei, nur das AGI-Script (perl) nicht.
    Meine Vermutung: Asterisk wird als root gestartet, dadurch kann sich kann asterisk die libfixchanskype ohne Probleme laden. Danach gibt Asterisk seine Rechte ab und wechselt zum Benutzer "asterisk".
    Nun wird das AGI-Script als Kind gestartet, das das Environment wird vererbt. Das Script wird nun mit den Rechten von asterisk gestartet und hat keinen Zugriff mehr auf die Library. Dadurch, dass ich Asterisk immer nur über die init-Scripts gestartet habe und mich dann mittels 'asterisk -r' verbunden habe, kam die Fehlermeldung für das glücklose Laden am stderr von Asterisk, das irgendwo war, aber logischerweise nicht auf meiner Konsole.

    Auf das muss man erst mal kommen...