Reverse lookup mit MySQL

britzelfix

Gesperrt
Mitglied seit
28 Mai 2004
Beiträge
1,099
Punkte für Reaktionen
0
Punkte
0
Die hier vorgestellte Lösung einer Rückwärtssuche
funktioniert mit Asterisk 1.4.x. Verbesserungsvorschläge
und Bugfixes sind willkommen.

Vorteile: Sehr schnell und skalierbar ;-)
Nachteile: Benötigt MySQL und die Installation der asterisk-addons.


Andere Lösungen:

Thorsten Gehrig's:
http://www.ip-phone-forum.de/showthread.php?t=60980
pbx-stefan's:
http://www.ip-phone-forum.de/showthread.php?t=120765




Requirements:
1)
Installation der asterisk-addons
Downloaden von http://downloads.digium.com/pub/asterisk/
Anleitung:
http://www.voip-info.org/wiki-Asterisk+cdr+mysql
Die Doku im Paket auch lesen!!
Die Daten der cdr_mysql.conf werden dann noch
benötigt.
2) Asterisk 1.4
Asterisk 1.2 nicht getestet.


Erzeugen einer Tabelle. Üblicherweise heißt die
Database asteriskcdrdb.

Code:
DROP TABLE IF EXISTS `contacts`;
CREATE TABLE `contacts` (
  `callerid` varchar(64) NOT NULL default '',
  `name` varchar(64) default NULL,
  `address` varchar(255) default NULL,
  `lastseen` datetime default NULL,
  PRIMARY KEY  (`callerid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Folgendes AGI nach /var/lib/asterisk/agi-bin kopieren
und Zugriffsrechte ändern:
chmod +x /var/lib/asterisk/agi-bin/revlookup.agi

Code:
#!/bin/sh

TMPFILE=/var/tmp/`basename $0`.$$.tmp
NOTIFY="root@localhost"
LINK="http://www3.dasoertliche.de/?form_name=search_inv&ph="


trap "rm -f $TMPFILE" 0 1 2 3 5 9 11 15

read _

agi_request=$(echo $1|sed -e 's,[^0-9],,g')

wget -q --timeout=3 -O $TMPFILE "${LINK}${agi_request}"
if [ -z "$TMPFILE" -o "$?" != "0" ]; then
    RLSTATUS="ERROR"
    echo "couldn't connect to ${LINK}"|\
    mail -s "revlookup.agi errors" "$NOTIFY"
else
    grep -q entry-opt $TMPFILE &&
        RX="class=\"entry-opt" ||
        RX="class=\"entry\""
    NAME=$(grep "$RX" $TMPFILE|sed -e 's,.*class=\"entry.*\">,,;s,</a>.*$,,')
    ADDRESS=$(grep "<br/>" $TMPFILE|sed -e 's,^[ ]*,,;s,<.*,,;s,&nbsp;, ,g'|head -1)
fi

echo 'SET VARIABLE NAME '"\"${NAME}\""
echo 'SET VARIABLE ADDRESS '"\"${ADDRESS}\""
echo 'SET VARIABLE RLSTATUS '"\"${RLSTATUS}\""
echo

Der Dialplan sieht dann so aus:

Code:
; ...  dialplan
exten => s,n,Macro(revdblookup,${CALLERID(num)})
exten => s,n,Set(CALLERID(name)=${RLNAME})


[macro-revdblookup]
; arg1 = nummer
exten => s,1,Set(NAME="")
exten => s,n,MYSQL(Connect connid localhost dbuser dbpass database)
exten => s,n,GotoIf($[${connid} = ""]?end)
exten => s,n,MYSQL(Query resultid ${connid} SELECT name FROM contacts where callerid=\"${ARG1}\")
exten => s,n,MYSQL(Fetch fetchid ${resultid} NAME ADDRESS)
exten => s,n,GotoIf($["${fetchid}" = "0"]?revl)
exten => s,n,MYSQL(Clear ${resultid})
exten => s,n,MYSQL(Query resultid ${connid} UPDATE contacts SET lastseen=now() WHERE callerid=\"${ARG1}\")
exten => s,n,Goto(enddb)
exten => s,n(revl),AGI(revlookup.agi,${ARG1})
exten => s,n,GotoIf($["${RLSTATUS}" = "ERROR"]?enddb)
exten => s,n,MYSQL(Query resultid ${connid} INSERT  INTO contacts VALUES (\"${ARG1}\"\,\"${NAME}\"\,\"${ADDRESS}\"\, now() ))
exten => s,n,MYSQL(Clear ${resultid})
exten => s,n(enddb),MYSQL(Disconnect ${connid})
exten => s,n(end),Set(GLOBAL(RLNAME)=${NAME})

Nummern, die nicht im Telefonverzeichnis vorhanden sind,
werden trotzdem gespeichert. Man kann sie nachträglich
in der Datenbank ergänzen.

Viel Spaß
britzelfix
 
Zuletzt bearbeitet:
asterisk-addons wollen bei mir einfach nicht compilen. das configure script läuft durch, aber bei make kommt folgender Fehler:
Code:
checking for correct ltmain.sh version... no
configure: error:

*** [Gentoo] sanity check failed! ***
*** libtool.m4 and ltmain.sh have a version mismatch! ***
*** (libtool.m4 = 1.5.23b, ltmain.sh = 1.4.3) ***

Please run:

  libtoolize --copy --force

if appropriate, please contact the maintainer of this
package (or your distribution) for help.

make[2]: *** [config.status] Error 1
make[2]: Leaving directory `/root/asterisk/asterisk-addons-1.4.2/asterisk-ooh323c'
make[1]: *** [chan_ooh323.so] Error 2
make[1]: Leaving directory `/root/asterisk/asterisk-addons-1.4.2'
make: *** [all] Error 2
Habe schon gegooglet, nen paar Sachen ausprobiert, aber nix hat geholfen. :(
Hat jemand einen Tipp?
asterisk-addons-1.4.2 benutze ich.

Vielen Dank

Edit: hier hatte jmd das gleiche Problem, aber gelöst: http://209.85.135.104/search?q=cach...ons&hl=de&ct=clnk&cd=1&gl=de&client=firefox-a
 
@Jansen_

Das liegt an den installierten development Paketen Deiner Distri.
Wahrscheinlich sind diese zu alt.
Du kannst versuchen bootstrap.sh auszuführen,
danach wieder configure ...
oder kommentiere das asterisk-ooh323c einfach aus.
Man braucht hierfür nur die cdr_addon_mysql.so

Gruß
britzelfix
 
britzelfix schrieb:
@Jansen_

Das liegt an den installierten development Paketen Deiner Distri.
Wahrscheinlich sind diese zu alt.
Du kannst versuchen bootstrap.sh auszuführen,
danach wieder configure ...
oder kommentiere das asterisk-ooh323c einfach aus.
Man braucht hierfür nur die cdr_addon_mysql.so

Gruß
britzelfix
Habe nun mit make menuselect, die Sachen, die ich nicht brauchte abgestellt. Damit lief das Übersetzen sauber durch.

Außerdem habe ich noch etwas, die extensions.conf verändert:
Aus
Code:
exten => s,n,MYSQL(Query resultid ${connid} REPLACE INTO contacts (callerid\,lastseen) VALUES (\"${ARG1}\"\,\"${STRFTIME(${EPOCH},,%Y%m%d-%H:%M:%S)}\"))
habe ich
Code:
exten => s,n,MYSQL(Query resultid ${connid} UPDATE contacts SET lastseen=\"${STRFTIME(${EPOCH},,%Y%m%d-%H:%M:%S)}\" WHERE callerid=${ARG1})
gemacht. Dann kann man später über ein Webinterface die Namen selber in die Datenbank eintragen. Mit dem Replace-Befehl wurden die bei mir immer wieder überschrieben.
 
Jansen_ schrieb:
Damit lief das Übersetzen sauber durch.

bestens.

Jansen_ schrieb:
Code:
exten => s,n,MYSQL(Query resultid ${connid} UPDATE contacts SET lastseen=\"${STRFTIME(${EPOCH},,%Y%m%d-%H:%M:%S)}\" WHERE callerid=${ARG1})
gemacht. Dann kann man später über ein Webinterface die Namen selber in die Datenbank eintragen. Mit dem Replace-Befehl wurden die bei mir immer wieder überschrieben.

Genau das habe ich gesucht. Danke!
Ich passe das erste Posting immer an. Es hat sich
inzwischen noch einiges mehr geändert.

Gruß
britzelfix
 
Ich habe bei mir in die mysql tabelle noch nen id feld eingefügt, damit es später einfacher ist mit dem Webinterface zu arbeiten. Außerdem habe ich lastseen den Typ datetime gegeben. Die Struktur sieht nun so aus:
Code:
CREATE TABLE `contacts` (
  `id` int(11) NOT NULL auto_increment,
  `callerid` varchar(64) NOT NULL default '',
  `name` varchar(64) default NULL,
  `address` varchar(255) default NULL,
  `lastseen` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `callerid` (`callerid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Dann habe ich noch etwas die Befehle in der extensions.conf vereinfacht (now() Befehl eingeführt und Feldnamen beim INSERT):
Code:
exten => s,n,MYSQL(Query resultid ${connid} UPDATE contacts SET lastseen=now() WHERE callerid=${ARG1})
Code:
exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO contacts (callerid\, name\, address\, lastseen) VALUES (\"${ARG1}\"\,\"${NAME}\"\,\"${ADDRESS}\"\, now()))

Grüße, Jan
 
@Jansen_

Sehr gute Vorschläge. Habe "now()"/datetime mit UPDATE statt REPLACE übernommen. Das "id" scheint mir nicht so wichtig, da callerid schon eindeutig ist. Man kann es nach belieben erweitern, etwa noch from context anfügen oder ein "userfield" usw...

Gruß
britzelfix
 
Hallo britzelfix,

erstmal danke für das tolle Script.

Aber ich habe da noch ein Problem:
In deinem Macro steht
Code:
exten => s,n,MYSQL(Query resultid ${connid} SELECT name FROM contacts where callerid=\"${ARG1}\")

Wenn ich das so ausführe, dann kommt bei mir die Meldung:
Code:
-- Executing [s@macro-revdblookup:3] GotoIf("SIP/20-082347f0", "0?end") in new stack
    -- Executing [s@macro-revdblookup:4] MYSQL("SIP/20-082347f0", "Query resultid 1 SELECT name FROM contacts where callerid=\"20\"") in new stack
[Oct  8 20:26:33] WARNING[13456]: app_addon_sql_mysql.c:272 aMYSQL_query: aMYSQL_query: mysql_query failed. Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"20\"' at line 1

Ist das mit dem \" korrekt?

Btw: Hast du ein Webfrontend um die Einträge zu editieren??

Gruß
Heiko
 
Hallo - ich hab noch ein - so glaube ich generelles Problem mit mysql - wobei das cdr geht - ich bekomme :

Code:
mysql_real_connect(mysql,dbhost,dbuser,dbpass,dbname,...) failed

meine res_mysql.conf sieht so aus (identisch wie die cdr_mysql) :

Code:
[general]
dbhost=gatekeeper.xxx.yyy
dbname=asteriskcdrdb
dbuser=asterisk
dbpass=xyz
dbport=3306
dbsock=/tmp/mysql.sock
~
 
Legt euch wieder hin - der Fehler saß zwischen Tastatur und Rückenlehne
 
hat jemand erfahrungen, ob das auhc mit Asterisk 1.2.26-BRIstuffed-0.3.0-PRE-1y-p läuft?
weil ja ganz am anfang von 1.4 gesprochen wird.
 
Hallo - ich hab noch ein - so glaube ich generelles Problem mit mysql - wobei das cdr geht - ich bekomme :

Code:
mysql_real_connect(mysql,dbhost,dbuser,dbpass,dbname,...) failed

meine res_mysql.conf sieht so aus (identisch wie die cdr_mysql) :

Code:
[general]
dbhost=gatekeeper.xxx.yyy
dbname=asteriskcdrdb
dbuser=asterisk
dbpass=xyz
dbport=3306
dbsock=/tmp/mysql.sock
~

selbiges Problem hab ich auch, jedoch noch nicht den fehler gefunden....

kanst du mir helfen???
 
Hallo, obige Funktion funtioniert einwandfrei bei mir. Würde aber gerne auch die Adresse auslesen und anzeigen, aber alle Modifikationen im SQL Statment (Hinzunahme der Adresse und Zuweisen einer Variablen) schlagen fehl. Hat jemand ne brauchbare Idee?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.