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.
 
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 $@ if $@;
	
	# 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;
# ----------------------------------------------------------------------------------------------------
 
oh, danke für die Idee. Allerdings benutz ich Asterisk ohne DB.
ibts keine einfachere Möglichkeit?
 
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
 
@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.