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

CallerID mit AGI an VDR per Telnet übermitteln

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von Ber5erker, 2 Juni 2004.

  1. Ber5erker

    Ber5erker Mitglied

    Registriert seit:
    6 Apr. 2004
    Beiträge:
    305
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo, jetzt kommt etwas kompliziertes:

    Ich möchte bei eingehenden Anrufen, dass Asterisk die CallerID (Nummer und evtl. Name) an meinen VDR schickt, sodass dieser eine OSD-Meldung auf meinem Fernseher ausgeben kann.

    In der extensions.conf wird mittels AGI ein Script aufgerufen:
    [...]
    exten => 100,1,agi(anruf.sh)
    exten => 100,2,Dial(SIP/100,60,tr)
    [...]

    Im "/usr/share/asterisk/agi-bin" habe ich das Script "anruf.sh" hinterlegt mit folgendem Inhalt:
    Code:
    #!/bin/sh
    #
    echo -e "mesg Text\nquit\n" | telnet activy 2001
    exit 0
    Soweit funktioniert auch alles, auf dem Fernseher erscheint bei einem eingehenden Anruf der Text "Text", jedoch soll ja die RUFNUMMER angezeigt werden :?

    FRAGE: Wie kann ich nun die Rufnummer abgreifen lassen und als Variable in meinem Script einsetzen?
     
  2. rajo

    rajo Admin-Team

    Registriert seit:
    31 März 2004
    Beiträge:
    1,958
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    AGI geht über stdin und stdout. Wenn dein Shellskript also so gemacht ist, dass es Variablen entgegennimmt, dann kannst Du mit

    exten => 100,1,agi(anruf.sh|<parameter>)

    wobei <parameter> dann die ${CALLERID} in Deinem Fall ist.


    (und im shell-skript dann mit $1 abgreifen:
    echo -e "mesg $1\nquit\n" | telnet activy 2001 )
     
  3. Ber5erker

    Ber5erker Mitglied

    Registriert seit:
    6 Apr. 2004
    Beiträge:
    305
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    DANKE!!!

    Genau das wars, was ich suchte!

    Das Script funzt 1A!
     
  4. rajo

    rajo Admin-Team

    Registriert seit:
    31 März 2004
    Beiträge:
    1,958
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    gibts davon screenshots? :)
     
  5. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    ist ja wahnsinn ... *habenwollen*
     
  6. Ber5erker

    Ber5erker Mitglied

    Registriert seit:
    6 Apr. 2004
    Beiträge:
    305
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hier die "Screenshots" 8)

    Sorry, wegen Guthabenmangel meines Handys gibts leider nur Screenshots innerhallb meiner VoIP-Anlage.

    "Seb intern" hab ich mein internes Softphone genannt, "102" ist die interne Nummer des Phones.

    "Drei von Tausend" hieß die Doku, die grad im Fernsehen lief ;-)

    PS: War gar nicht so einfach, die Bilder hochzuladen.
    Der Konqueror (KDE 3.2.2) mag die Attachment-Funktion des Boards überhaupt nicht :-(
     

    Anhänge:

  7. BEEjay

    BEEjay Neuer User

    Registriert seit:
    5 Aug. 2004
    Beiträge:
    3
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das kann man auch für isdn machen ... in www.vdrportal.de (sorry für werbung) muss man nur nach isdn + onscreen schauen dann zeigt er mittels callerid.conf auch an wer grade anruft.
     
  8. pixelpeter

    pixelpeter Neuer User

    Registriert seit:
    24 Aug. 2004
    Beiträge:
    59
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo,

    Was hat es mit der callerid.conf auf sich. Kann ich auf meinem system nicht finden. Wo muss das Teil liegen?
    Ich möchte gern über einen AGI Script "Echte" Namen aus Callerid's ermitteln.


    Peter
     
  9. lxuser

    lxuser Mitglied

    Registriert seit:
    4 Nov. 2004
    Beiträge:
    287
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Inverssuche

    Hallo,

    könnte man die Inverssuche der Telekom einbinden um den Namen des Anrufers anzeigen zu lassen?

    Habe hier folgendes gefunden:
    Gruss lxuser
     
  10. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    der einzeiler ist schonmal genial.
    Ich schau mal was ich machen kann - bin aber kein script-profi.
    Wer schneller ist soll sein ergebniss schonmal veröffentlichen :-D

    Gruß
    Thorsten Gehrig
     
  11. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hier meine (vorläufige) Lösung:
    in den conext für ankommende gespräche:
    exten xxxx,1,System(/etc/asterisk/reverse.sh ${CALLERIDNAME} &)

    das passende script sieht dann so aus:
    Code:
    #!/bin/sh
    #
    echo -e -n "mesg Anruf von " >/etc/asterisk/anruf.txt
    echo -e -n "$1" >>/etc/asterisk/anruf.txt
    
    lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$1&main=Antwort&s=2" \
    -dump -nolist | grep printselected.gif -A 2 -m 1 | awk '{ if (NR>1) {printf $0} } ' >>/etc/asterisk/anruf.txt
    
    echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt
    
    cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001
    
    exit 0
    
    
    Ich baue mir hier - zugegebenermassen recht umständlich - meinen Anzeigestring zusammen. Jeder kann seinen Pfad nach belieben anpassen...

    Da alle mir bekannten Handynummern noch nicht per Reverse-Lookup funktionieren werde ich mir wohl noch was überlegen müssen dass ich vorher per "LookupCIDName" schaue ob ich nicht schon selbst eine Caller-ID gespeichert habe.
    Ausserdem währe es vielleicht nicht schlecht die Caller-ID auch an Asterisk mit zurück zu geben - für SIP telefone (die können sowas ja auch anzeigen).
    Es ist nur die Frage wie man sowas macht - und ob die Abfrage schnell genug ist...

    Für verbesserungsvorschläge bin ich JEDERZEIT OFFEN UND DANKBAR!!!

    Gruß
    Thorsten Gehrig
     
  12. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    verbessertes script

    Hi
    in Anlehnung an VDRPortal habe ich das script (von dort) auf den Asterisk angepasst.

    Vorteil: einen Cache - in den man auch selbst (nicht revers-suche-erlaubte) Rufnummern eintragen kann und durch den cache weniger Onlinezugriffe (wir wollen die ja schonen.... oder?)

    Die Pfade können beliebig angepasst werden...
    Code:
    #!/bin/sh 
    # 
    #pfad zum cachefile
    CACHE="/var/spool/asterisk/invsuche_cache"
    
    #pfad um das tempfile anzulegen
    TMPFILE="/tmp/tmpsuche"
    LOG="/var/log/asterisk/inverssuche_log"
    
    NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`
    
    echo "Suche nach $NUMMER im cache"
    NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
    DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
    echo "Name: $NAME"
    echo "Details: $DETAILS"
    if [ "$NAME" == "" ]; then
        echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
        lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
        -dump -nolist -connect_timeout=3>  $TMPFILE
    		
        NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
        DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
    		
        if [ "$NAME" == "" ]; then
            if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
                NAME="Telefonnummer $NUMMER"
                DETAILS="Kein Eintrag $2"
            fi;
        fi;
    									
        if [ "$NAME" == "" ]; then
            NAME="Telefonnummer $NUMMER"
            DETAILS="Fehler $2"
        else
            echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
        fi;
        echo "Name: $NAME"
        echo "Details: $DETAILS"
    												    
    fi
    
    echo -e -n "mesg " >/etc/asterisk/anruf.txt
    echo -e -n "TEL:$NAME " >>/etc/asterisk/anruf.txt
    echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt
    
    cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001
    
    echo -e -n "mesg " >/etc/asterisk/anruf.txt
    echo -e -n "$DETAILS " >>/etc/asterisk/anruf.txt
    echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt
    
    cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001
    
    exit 0
    
    Für die commands.conf vom vdr noch diesen Eintrag:
    Code:
    Anrufliste :  grep "vdr\[.*\]: info: TEL:" /var/log/messages | tail -n 100 | tac
    
    Jetzt müsste nur noch von den richtigen experten der Tip dazukommen wie man eine Variable (CALLERIDNAME oder so) aus einem Script heraus setzen kann.... -WER KANN HELFEN?-

    Gruß
    Thorsten
     
  13. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    echo "SET VARIABLE variablenname variblenwert"

    Keine Ursache
    Dominic
     
  14. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi @DerDominic,

    kannst du mir ein Beispiel nennen?
    Ich habe zumindest in der Theorie alles verstanden - in der Praxis funktionier es bei mir aber nicht :-(

    Annahme 1) ich muss per AGI und nicht per SYSTEM aufrufen -> kein Problem
    Annahme 2) das File muss bei /var/lib/asterisk/agi-bin/ liegen -> kein Problem

    ich habe folgendes Testscript
    Code:
    #!/bin/bash
    
    echo 'SET VARIABLE CALLERIDNAME "TEST" '
    echo 'SET CALLERID "0815"  '
    
    exit 0
    
    aber es funktioniert nicht - meine CALLERIDNAME und meine CALLERID sind wie vorher....

    Wo liegt mein Fehler? Oder hat jemand ein Beispiel-AGI wo Bash und ein/ausgabe an Asterisk genutzt wird? (die meisten benutzen Perl - und das kann ich nicht ...)

    Gruß
    Thorsten Gehrig
     
  15. DerDominic

    DerDominic Neuer User

    Registriert seit:
    1 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    Dipl. Ing. tI
    Ort:
    Quierschied
    Kuck mal, hier im Forum habe ich auch noch ein Bash-Script mit agi und teltarif, da kannst Du es Dir 'abkäsen'

    Gruß
    Dominic
     
  16. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ich habs mittlerweile - (hab am ENUM-script ´abgekäst´).
    Dan´ke
     
  17. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Neue Version vom Reverse-Callerid-Lookup-Script

    Hallo
    so langsamm wird das script sauber....

    Änderungen / Fukntionsweisse des neuen Scipts:
    es muss nach l:\var\lib\asterisk\agi-bin kopiert werden.

    Es werden folgende Files angelegt:
    /var/spool/asterisk/inverssuche_cache
    Hier werden die suchergebnisse gecached - für Rufnummern die nicht gefunden werden kann man hier auch MANUELL den richtigen Namen eintragen - dann wird er beim nächsten mal aus dem cache gefunden!!

    /var/log/asterisk/anrufliste_log
    Hier stehen die eingegangenen Anrufe drinnen - in einem Format was man wunderbar am VDR lesen kann (commands.cmd => tac /pfad/zum/log/anrufliste_log | tail -n 100 )

    Der gefundene Namen wird an Asterisk als variable LONGNAME zurückübergeben und kann ausgewertet werden (wird z.B. bei mir im SIP-Telefondisplay angezeigt!)

    In der extensions.conf sieht das ganze bei mir so aus:

    Code:
    exten => 12345,1,SetLanguage(de)
    exten => 12345,2,AGI,reverse.agi| ${CALLERIDNUM}
    exten => 12345,3,SetCIDName(${LONGNAME})
    exten => 12345,4,SetCIDNum(0${CALLERIDNUM})
    
    Danke an alle die mir geholfen haben und an alle von denen ich abgekupfert habe! :-D

    Gruß
    Thorsten Gehrig
     
  18. TomS

    TomS Neuer User

    Registriert seit:
    13 Nov. 2004
    Beiträge:
    199
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hi Thorsten,

    danke für das tolle Script. Jetzt fehlt nur noch der letzte Stand Deines Scripts mit der Variablen-Rückgabe - zumindest finde ichs in der letzten Nachricht nicht. Ich erlaube es mal selber auf Grundlage Deines ersten Scripte zu vervollständigen:
    Code:
    #!/bin/sh
    #
    #pfad zum cachefile
    CACHE="/var/spool/asterisk/invsuche_cache"
    
    echo -n "SET VARIABLE LONGNAME "\"
    
    
    #pfad um das tempfile anzulegen
    TMPFILE="/tmp/tmpsuche"
    LOG="/var/log/asterisk/inverssuche_log"
    
    NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`
    
    #echo "Suche nach $NUMMER im cache"
    NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
    DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
    echo -n "$NAME"
    if [ "$NAME" == "" ]; then
        #echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
        lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
        -dump -nolist -connect_timeout=3>  $TMPFILE
    
        NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
        DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
    
        if [ "$NAME" == "" ]; then
            if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
                NAME="Telefonnummer $NUMMER"
                DETAILS="Kein Eintrag $2"
            fi;
        fi;
    
        if [ "$NAME" == "" ]; then
            NAME="Telefonnummer $NUMMER"
            DETAILS="Fehler $2"
        else
            echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
        fi;
        echo -n "$NAME"
    fi
    
    echo -n "\""
    exit 0
    
    Gruß,
    Tom
     
  19. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi TomS,

    freud mich das das Script freunde findet :-D

    eigentlich sollte das script attached sein - ist wohl irgendwie schiefgelaufen....

    Bevor ich mir jetzt deine änderungen anschaue - lege ich lieber nochmal mein Script bei :-D

    Gruß
    Thorsten
    Code:
    #!/bin/sh 
    # 
    read agi_request
    read agi_language
    read agi_channel
    read agi_type
    read agi_uniqueid
    read agi_callerid
    read agi_dnid
    read agi_rdnis
    read agi_context
    read agi_extension
    read agi_priority
    read agi_enhanced
    read agi_accountcode
    read emptyline
    
    #pfad zum cachefile
    CACHE="/var/spool/asterisk/invsuche_cache"
    
    #pfad um das tempfile anzulegen
    TMPFILE="/tmp/tmpsuche"
    LOG="/var/log/asterisk/anrufliste_log"
    
    if [ "$1" == " " ]; then
        NAME="anonymer Anrufer"
        DETAILS="Keine details"
    else
        NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`
        #echo "Suche nach $NUMMER im cache"
        NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
        DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
        #echo "Name: $NAME"
        #echo "Details: $DETAILS"
        if [ "$NAME" == "" ]; then
        #    echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
            lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
            -dump -nolist -connect_timeout=3>  $TMPFILE
            NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
            DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
            if [ "$NAME" == "" ]; then
                if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
                    NAME="Telefonnummer $NUMMER"
                    DETAILS="Kein Eintrag $2"
                fi;
            fi;
            if [ "$NAME" == "" ]; then
                NAME="Telefonnummer $NUMMER"
                DETAILS="Fehler $2"
            else
                echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
            fi;
        fi
    fi
    
    echo -e -n "mesg TEL:$NAME \nquit\n" | telnet vdr.gehrig.lan 2001
    echo -e -n "mesg $DETAILS \nquit\n"  | telnet vdr.gehrig.lan 2001
    echo -e "`date +%e.%m\ %H:%M ` $NAME " >>$LOG
    echo 'SET VARIABLE LONGNAME '"\"$NAME\"" >/dev/stdout
    read in
    
    exit 0
    
     
  20. Fux

    Fux Mitglied

    Registriert seit:
    3 Juni 2004
    Beiträge:
    420
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Du benutzt lynx. Warum dieses ? Ginge es auch mit wget ?