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

Internes Telefonbuch?

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von lo4dro, 27 Nov. 2004.

  1. lo4dro

    lo4dro Mitglied

    Registriert seit:
    14 Okt. 2004
    Beiträge:
    656
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  2. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    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;
    # ----------------------------------------------------------------------------------------------------
    
     
  3. lo4dro

    lo4dro Mitglied

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

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
  5. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    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
     
  6. chaos2000

    chaos2000 Aktives Mitglied

    Registriert seit:
    22 Aug. 2004
    Beiträge:
    2,028
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    LE
    @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 ;)
     
  7. lo4dro

    lo4dro Mitglied

    Registriert seit:
    14 Okt. 2004
    Beiträge:
    656
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Vielen Dank für den Tipp. Werd mir das ganze mal anschauen.