Internes Telefonbuch?

lo4dro

Mitglied
Mitglied seit
14 Okt 2004
Beiträge
656
Punkte für Reaktionen
0
Punkte
0
Hallo.

Ich nutz ein kleines Script, damit auf meinem VDR eingehende Anrufe angezeigt werden.

exten => 12345,1,agi(vdr-callerid.sh|${CALLERID},${EXTEN})

Damit werden allerdings nur Nummern übermittel.

Schöner wäre es, wenn man Namen zu den ${EXTEN} zuordnen könnte & ein Telefonbuch füren das anstatt der Nummer bei ${CALLERID} den Namen anzeigt.

Hab hier schon gesucht, aber nichts gefunden.

Einen Tipp wo ich suchen muss würde mich freuen.
 

chaos2000

Aktives Mitglied
Mitglied seit
22 Aug 2004
Beiträge
2,028
Punkte für Reaktionen
0
Punkte
36
habe mir soeben mal gedanken darüber gemacht;

füge einfach in folgende Zeilen in das script ein
Code:
require mySqlLib;
my $DBH = connectDb();
my %REQ2=readDbMore($DBH,"select `firstname`, `lastname` from telefonbuch WHERE $ARGV[0] =`phone` or $ARGV[0] =`mobile`");
foreach my $zeile (sort keys %REQ2) {
	foreach my $spalte (sort keys %{$REQ2{$zeile}}) {
		print " ".$REQ2{$zeile}{$spalte};
	}
}
diese zeilen bewirken eine Abfrage der DB nach der übergebenen telefonnummer;
es wird noch das folgende Modul benötig in dem alle DB-Daten stehen

Code:
# mySqlLib.pm
sub connectDb {
	eval "use DBI 1.19;";

	# exit to error eval
	die [email protected] if [email protected];
	
	# database-driver
	my %DB = (	driver		=>	'mysql',

			# database-host
			host		=>	'localhost',
				
			# database
			name		=>	'asterisk',

			# database-user
			user		=>	'asterisk',

			# database-user-passwort
			passwort	=>	'',
		);

	# stelle Verbindung zur Datenbank her und gebe Datenbank-handle nach $DBH zurück
	my $DBH = DBI->connect("DBI:$DB{driver}:$DB{name}:$DB{host}", $DB{user}, $DB{passwort});
	
	# Datenbank-Handle an Aufrufende zurückgeben
	return $DBH;
} 
# <--------------------- sub connectDb



# sub lesen aus Datenbank (mit dieser sub ist auch
# das schreiben in eine datenbank möglich)
#
# SYNTAX:
# my %request = readDb("[SQL-SYNTAX]");
sub readDb {
	
	# SQL-SYNTAX holen
	my $SYNTAX = shift;

	# Datenbank connect
	my $DBH = connectDb();

	# Datenbank auslesen, Daten in %DB_REQ zurückgeben
	my %DB_REQ=&readDbMore($DBH,$SYNTAX);

	# Datenbank disconnect
	disconnectDb($DBH);

	# %DB_REQ an Aufrufende zurückgeben
	return %DB_REQ;
} # <--------------------- sub readDb


# sub schreiben in Datenbank
#
# SYNTAX:
# doDb("[SQL-SYNTAX]");
sub doDb {
	
	# SQL-SYNTAX holen
	my $SYNTAX = shift;

	# Datenbank connect
	my $DBH = connectDb();

	# SQL-Anfrage ausführen
	$DBH->do($SYNTAX);

	# Datenbank disconnect
	disconnectDb($DBH);

	# true zurückgeben (ist nur der Form 
	# halber oder wenn Abfragen, ob IO enthalen)
	return 1;
} # <--------------------- sub doDb


# sub lesen aus Datenbank (mit dieser sub ist auch 
# das schreiben in eine datenbank möglich)
# Diese Sub ist anzuwenden, wenn man mehrere Anfragen 
# an eine Datenbank hat und nicht jedesmahl neu connecten will (Zeit)
#
# SYNTAX:
# my %request = readDbMore($Datenbank-Handle,"[SQL-SYNTAX]");
sub readDbMore {

	# Datenbank-Handle holen
	my $DBH = shift;

	# SQL-SYNTAX holen
	my $SYNTAX = shift;

	# globale Variablen deklarieren (sind nur in der Sub gültig)
	my (@COLUMNS,$TABLE);

	# SYNTAX parsen, um zu prüfen, ob eine select-Anweisung. Wenn ja, dann ...
	if ($SYNTAX=~/^select (.*) from ([\S]*)( .*)?/i) {

		# Feldnamen und Tabellennamen holen ...
		my $COLUMNS=$1; $TABLE=$2;

		# wenn Feldnamen explizit angegeben, dann ...
		unless ($COLUMNS=~/\*/) {

			# Feldnamen ...
			$COLUMNS=~s/[ \`\"\']//g;

			# holen und in ARRAY @COLUMNS zurückgeben
			@COLUMNS=split(/,/,$COLUMNS);

		# wenn Feldnamen nicht explizit angegeben, als alle Felder
		# (SQL-SYNTAX: select * from ....), dann ...
		} else {

			# die Feldnamen aus der Tabelle selbst abfragen
			# (hier SQL-SYNTAX vorbereiten)
			my $STH = $DBH->prepare("show columns from $TABLE");

			# hier Anfrage an die Datenbank senden
			$STH->execute();

			# Rückgabewerte der Datenbank in @FIELDS zurückgeben
			while (my @FIELDS = $STH->fetchrow_array()) {

				# Feldnamen in @COLUMNS speichern
				push @COLUMNS ,$FIELDS[0];
			}

			# Datenbankabfrage beenden
			$STH->finish();
		}
	}

	# eigendliche Datenbankanfrage vorbereiten (nur wenn $SYNTAX angegeben)
	my $STH = $DBH->prepare($SYNTAX) if $SYNTAX;

	# Hash für Rückgabewert an Aufrufende deklarieren
	my %DB_REQ;

	# hier Anfrage an die Datenbank senden
	$STH->execute();

	# internen Zähler für Zeilen mit 0 deklarieren
	my $II=0;

	# Rückgabe der Datenbank zeielenweise durchgehen
	while (my @FIELDS = $STH->fetchrow_array()) {

		# dabei die Anzahl der Feldnamen berücksichtigen
		# (dient zur Aufbereitung des Rückgabewertes für Aufrufende)
		for (my $I=0;$I<=$#FIELDS ;$I++) {

			# einzelne Felder in 2 Dimensionen
			# (1. Rückgabezeile/Datenbankzeile, 2. Feldname)
			# im Hash %DB_REQ speichern
			$DB_REQ{$II}{$COLUMNS[$I]}=$FIELDS[$I];
		}

		# Zähler für Zeilen ikrementieren
		$II++;
	}

	# Datenbankabfrage beenden
	$STH->finish();

	# Mehrdimensionalen Hash an Aufrufende zurückgeben
	return %DB_REQ;
} # <--------------------- sub readDbMore

# sub connect Database
sub disconnectDb {

	# Datenbank-Handle holen
	my $DBH=shift;

	# Datenbank disconnect
	$DBH->disconnect();
} # <--------------------- sub disconnectDb

# true für require
1;
# ----------------------------------------------------------------------------------------------------
 

lo4dro

Mitglied
Mitglied seit
14 Okt 2004
Beiträge
656
Punkte für Reaktionen
0
Punkte
0
oh, danke für die Idee. Allerdings benutz ich Asterisk ohne DB.
ibts keine einfachere Möglichkeit?
 

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0

chaos2000

Aktives Mitglied
Mitglied seit
22 Aug 2004
Beiträge
2,028
Punkte für Reaktionen
0
Punkte
36
Du kannst dieses auch benutzen ohne das deine Konfiguration in einer DB steht;
Es gebe noch die Möglichkeit die asterisk eigenen DB zu verwenden oder die daten in einemn DB/TXT File zu speichern;
Meiner Meinung nach ist dies aber recht umständlich und neigt leicht zu Fehler;

cu
 

chaos2000

Aktives Mitglied
Mitglied seit
22 Aug 2004
Beiträge
2,028
Punkte für Reaktionen
0
Punkte
36
@betateilchen

genau die idee hatte ich anfangs auch;
Was mich dann davon abgebracht hatte ist das somit nur ein Datensatz pro Person angelegt werden muss; ausserdem hat man noch sein eigenes ENUM ;)
 
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.

IPPF im Überblick

Neueste Beiträge