LDAP Verzeichnis per PHP in XML an Cisco Telefone senden

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Mal wieder ein kleines Skript :D

Diesmal geht es darum, die Telefonnummern aus einem LDAP Server zu lesen und in XML umgewandelt als <CiscoIPPhoneDirectory> bereitzustellen. Hierzu wird PHP verwendet.

Das ganze Skript sollte voll parametrisierbar sein, um bei unterschiedlichen Anforderungen ohne große Änderung eingesetzt werden zu können. Deshalb wird das Ganze über 5 Variablen konfiguriert, die am Anfang des Skripts stehen:

PHP:
 $lv_server="localhost";
 $lv_basedn="dc=domain,dc=com";
 $lv_url="http://meinwebserver/ldapdir.php";
 $lt_fieldname=array ("homephone", "mobile", "telephonenumber");
 $lt_fielddesc=array ("Privat", "Handy", "Firma");

  • $lv_server ist der Name oder die IP des LDAP Servers, der abgefragt werden soll
  • $lv_basedn ist die Basis im LDAP Baum, an dem die Suche startet
  • $lv_url ist die komplette http Adresse der PHP Datei. Diese Angabe ist notwendig, weil sie im Skript zur URL-Erzeugung gebraucht wird
  • $lt_fieldname ist eine Aufzählung der LDAP Attribute, die ausgelesen werden sollen Wichtig: alles in kleinbuchstaben angeben !
  • $lt_fielddesc ist eine zur Feldliste passende Aufzählung von Beschreibungen, die in der Anzeig der jeweiligen Rufnummer verwendet wird. Die Reihenfolge muß mit der Reihenfolge in $lt_fieldname übereinstimmen !

Zum Ablauf:

Die PHP Datei erzeugt zuerst ein XML Objekt vom Typ <CiscoIPPhoneInput> in dem der User einen Suchbegriff eingibt. Z.B. "neu"
Nach der Übergabe dieses Suchbegriffes wird am Telefon eine Liste (XML Objekttyp <CiscoIPPhoneMenu>) der gefundenen Personen ausgegeben, z.B.

  1. Heinz Neubert
  2. Dieter Neumüller

aus welcher der Anwender dann den gewünschten Namen auswählt. Danach werden sämtliche Attribute (= Telefonnummern) dieser Person (entsprechend der Liste in $lt_fieldname) ausgelesen und als <CiscoIPPhoneDirectory> angezeigt. Aus dieser Liste kann dann direkt gewählt werden.

Der Einfachheit halber wird mal davon ausgegangen, daß es nicht mehr als 50 Namen zum eingegebenen Suchbegriff gibt und auch pro Person nicht mehr als insgesamt 32 Rufnummern vorhanden sind :wink:

Es ist mir völlig bewußt, daß man das Skript noch optimieren kann. Mir geht es aber hauptsächlich darum, die Funktionsweise klar ersichtlich darzustellen. Viel Spaß damit !

PHP:
<?php
 header("Content-type: text/xml");
 header("Connection: close");

 $lv_server="localhost";
 $lv_basedn="dc=domain,dc=com";
 $lv_url="http://meinwebserver/ldapdir.php";
 $lt_fieldname=array ("homephone", "mobile", "telephonenumber");
 $lt_fielddesc=array ("Privat", "Handy", "Firma");

 if (!$suchwert) {
    print ("<CiscoIPPhoneInput>\n");
    print ("<Title>LDAP Suche</Title>\n");
    print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
    print ("<URL>".$lv_url."</URL>\n");
    print ("<InputItem>\n");
    print ("<DisplayName>Suche nach</DisplayName>\n");
    print ("<QueryStringParam>suchwert</QueryStringParam>\n");
    print ("<DefaultValue />\n");
    print ("<InputFlags>L</InputFlags>\n");
    print ("</InputItem>\n");
    print ("</CiscoIPPhoneInput>\n");
 } else {
        if (!isset($entry)) {
            print ("<CiscoIPPhoneMenu>\n");
        print ("<Title>Suchergebnis</Title>\n");
                print ("<Prompt>Bitte auswählen !</Prompt>\n");
                $ds=ldap_connect($lv_server);
        if ($ds) {
                $r    = ldap_bind($ds);
            $sr   = ldap_search($ds, $lv_basedn, "sn=$suchwert*");
            $info = ldap_get_entries($ds, $sr);
            for ($i=0; $i<$info["count"]; $i++) {
                print ("<MenuItem>\n");
                print ("<Name>".$info[$i]["cn"][0]."</Name>\n");
                print ("<URL>".$lv_url."?entry=$i&amp;suchwert=$suchwert*</URL>\n");
                print ("</MenuItem>\n"); }
                ldap_close($ds); }
            print ("</CiscoIPPhoneMenu>\n");
    } else {
            print ("<CiscoIPPhoneDirectory>\n");
                print ("<Prompt>Bitte auswählen !</Prompt>\n");
                $ds=ldap_connect($lv_server);
        if ($ds) {
                $r    = ldap_bind($ds);
                $sr   = ldap_search($ds, $lv_basedn, "sn=$suchwert");
                $info = ldap_get_entries($ds, $sr);
                print ("<Title>".$info[$entry]["cn"][0]."</Title>\n");
                for ($j=0; $j<sizeof($lt_fieldname); $j++) {
                        for ($i=0; $i<sizeof($info[$entry][$lt_fieldname[$j]])-1; $i++) {
                        print ("<DirectoryEntry>");
                        print ("<Name>".$lt_fielddesc[$j]."</Name>");
                        print ("<Telephone>".$info[$entry][$lt_fieldname[$j]][$i]."#</Telephone>\n");
                        print ("</DirectoryEntry>"); }
                }
                ldap_close($ds); }
        print ("</CiscoIPPhoneDirectory>\n");
    }
 }
 
Hi,


Würde mit diesem Skript gerne unseren LDAP Server anzapfen. In diesem sind alle Daten gespeichert.
Allerdings ist mir nicht genau klar wie ich das Skript einsetzen muss:confused:
Was muss im CallManager oder bei den IP-Phones eingestellt werden?
 
Du mußt das Skript aut einem PHP fähigen Webserver ablegen, die beschriebenen Variablen am Anfang des Skripts anpassen und die URL in die Telefone eintragen. Das mit der URL wird wohl über den Callmanager gehen - da ich nicht mit CM arbeite, kann ich Dir das aber nicht genau beschreiben. Die URL sollte entweder unter den Services oder in den Directories im Telefon auftauchen.
 
Kannst du noch eine Benutzeranmeldung hinzufügen?
 
Hallo zusammen,

der Beitrag scheint ja ganz interessant zu sein.
Habe das einmal ausprobiert, aber leider bin ich nicht zum Erfolg gekommen.
Nach Angabe des Scripts in einem Cisco IP Phone erscheint leider nur die Meldung :

XML-Fehler[4]: Analysefehler

Kann mir da einer weiterhelfen was ich falsch gemacht habe?!

Vielen Dank

mfg
snowdog

edit:
Wenn ich das Script im Browser anschaue, erscheint die Meldung:

Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.


--------------------------------------------------------------------------------

In einem XML-Dokument ist nur ein Element höchster Ebene zugelassen. Fehler beim Bearbeiten der Ressource 'http://.......

<b>Notice</b>: Undefined variable: suchwert in <b>c:\inetpub\wwwroot\ldapdir.php</b> on line <b...



Das ist doch auch nicht normal, oder?
Habe leider von xml nicht sehr viel ahnung.

Vielen Dank nochmal!
 
Zuletzt bearbeitet:
Hast Du das Problem mitlerweile gelösst?
 
Hallo,

nein leider noch nicht.
Aber damit setze ich mich nun nicht weiter auseinander.
Da wir sowieso einen Servicevertrag mit T-Systems haben, sollen die danach schauen, dafür werden die ja bezahlt :p

Gruß
snowdog
 
ok, dann kann ich ja mal versuchen ob wir das problem lösen können.
 
Interessant daß dieser Thread nun nach über einem Jahr wieder ausgegraben wurde, nachdem seinerzeit offenbar nicht allzu viel Interesse bestand.

Eine Benutzerverwaltung werde ich in das Script nicht einbauen. Es genügt wenn ein anonymer Lesezugriff besteht, was in >90% aller Konfigurationen vorhanden sein dürfte.

Bezüglich der anderen Fehler stellt sich die Frage, welches Telefon und welche Firmware auf diesem Telefon verwendet wird. Auf meinem Cisco 7970 mit SCCP Firmware funktioniert das Script nach wie vor problemlos.

@chaos2000 sehen wir uns in zwei Wochen beim Usertreffen in LE :wink:
 
betateilchen schrieb:
sehen wir uns in zwei Wochen beim Usertreffen in LE :wink:

Klar, ich bin dabei. Dieses mal dürfte nichts dazwischen kommne - hoffe ich.
 
Das Script geällt mir :-)
nur leider bekomm ich es nicht zum laufen :-(
Ich hab es auf einem Apache2 mit PHP4 & PHP4-Ldap.
Mein Telefon zeigt mit die Such Seite (LDAP Suche) auch an,
übergibt auch an den Webserver den Get mit der Suchanfrage
("GET /ldap.php?suchwert=a HTTP/1.1" 200 314 "-" "Allegro-Software-WebClient/3.12")
doch dann fängt alles wieder bei der Suchseite an.
Mein Slapd loggt nicht einmal einen Verbindungsversuch.
Fehlen mir irgendwelche Libs ?
 
Zuletzt bearbeitet:
hemm ich komm da nicht weiter
Nun hab ich das ganze Script schon dreimal durch.
wenn ich das erste "} else {" auskommentiere versucht er wenigstens einen Connect am Ldap läuft dann aber wieder auf einen
PHP:
XML-Verarbeitungsfehler: "Junk" nach Dokument-Element
Adresse: http://192.168.0.1/asterisk/ldap.php?suchwert=m
Zeile Nr. 12, Spalte 1: 
<CiscoIPPhoneMenu>
^


PHP:
 if (!$suchwert) {
        print ("<CiscoIPPhoneInput>\n");
        print ("<Title>LDAP Suche</Title>\n");
        print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
        print ("<URL>".$lv_url."</URL>\n");
        print ("<InputItem>\n");
        print ("<DisplayName>Suche nach</DisplayName>\n");
        print ("<QueryStringParam>suchwert</QueryStringParam>\n");
        print ("<DefaultValue />\n");
        print ("<InputFlags>L</InputFlags>\n");
        print ("</InputItem>\n");
        print ("</CiscoIPPhoneInput>\n");

//      } else {
        if (!isset($entry)) {
        print ("<CiscoIPPhoneMenu>\n");
        print ("<Title>Suchergebnis</Title>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
        $ds=ldap_connect("localhost");
 
hab jetzt nicht genau auf das script geschaut, aber ich denke mal es hat mit der php-konfiguration zu tun;
schreib mal anstatt
PHP:
 if (!$suchwert) {
folgendes
PHP:
 if (!isset($_GET['suchwert'])) {

Besser ist noch wenn du nach der Vaiablendefinition
PHP:
$suchwert = (isset($_GET['suchwert']))?$_GET['suchwert']:null;

schreibst
 
ich kann da machen was ich will ...
PHP:
<?php
header("Content-type: text/xml");
header("Connection: close");

$lv_server="192.168.0.1";
$lv_basedn="dc=domain,dc=org";
$lv_url="http://192.168.0.1/asterisk/ldap.php";
$lt_fieldname=array ("homephone", "mobile", "telephonenumber");
$lt_fielddesc=array ("Privat", "Handy", "Firma");
$suchwert = (isset($_GET['suchwert']))?$_GET['suchwert']:null;
    if (!$suchwert) {
//      if (!isset($_GET['suchwert'])) {


        print ("<CiscoIPPhoneInput>\n");
        print ("<Title>LDAP Suche</Title>\n");
        print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
        print ("<URL>".$lv_url."</URL>\n");
        print ("<InputItem>\n");
        print ("<DisplayName>Suche nach</DisplayName>\n");
        print ("<QueryStringParam>suchwert</QueryStringParam>\n");
        print ("<DefaultValue />\n");
        print ("<InputFlags>L</InputFlags>\n");
        print ("</InputItem>\n");
        print ("</CiscoIPPhoneInput>\n");

        } else {
        if (!isset($entry)) {
        //if (!isset($_GET['suchwert'])) {
        print ("<CiscoIPPhoneMenu>\n");
        print ("<Title>Suchergebnis</Title>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
        $ds=ldap_connect("localhost");

                if ($ds) {

        $r=ldap_bind($ds);
        $sr=ldap_search($ds, $lv_basedn, "sn=$suchwert*");
        $info=ldap_get_entries($ds, $sr);
         for ($i=0; $i<$info["count"]; $i++) {

         print ("<MenuItem>\n");
         print ("<Name>".$info[$i]["cn"][0]."</Name>\n");
         print ("<URL>".$lv_url."?entry=$i&amp;suchwert=$suchwert*</URL>\n");
         print ("</MenuItem>\n"); }
         ldap_close($ds); }

        print ("</CiscoIPPhoneMenu>\n");
   } else {
   print ("<CiscoIPPhoneDirectory>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
    $ds=ldap_connect($lv_server);

      if ($ds) {
      $r=ldap_bind($ds);
     $sr=ldap_search($ds, $lv_basedn, "sn=$suchwert");
     $info=ldap_get_entries($ds, $sr);

        print ("<Title>".$info[$entry]["cn"][0]."</Title>\n");
     for ($j=0; $j<sizeof($lt_fieldname); $j++) {
     for ($i=0; $i<sizeof($info[$entry][$lt_fieldname[$j]])-1; $i++) {

    print ("<DirectoryEntry>");
    print ("<Name>".$lt_fielddesc[$j]."</Name>");
    print ("<Telephone>".$info[$entry][$lt_fieldname[$j]][$i]."#</Telephone>\n");
    print ("</DirectoryEntry>"); }
             }
    ldap_close($ds); }
     print ("</CiscoIPPhoneDirectory>\n");

         }
    }
?>
 
Was haltet ihr von dieser Implementierung hier:

http://www.thelastinstance.de/soft/project13.phtml


Was ich aber bisher nicht gefunden habe ist eine vernuenftige Beschreibung der XML-"Applikationen" wie das Zeug von Cisco wohl genannt wird. Will kein PHP verwenden und mich daher auch nicht durch das Zeug durchwuehlen...
 
hi McRib,

die MySQL Version läuft gut.Die Dateneingabe auf dem Webfrontend ist einfach und auch beim installieren lief dank der beiliegenden SQL Befehle alles glatt durch .
Doch "leider" habe ich schon einen Slapd und würde somit ungern die Mühe auf mich nemen, alle Daten jetzt in eine andere Datenbank ein zu pflegen.
Ich verstehe halt bloss nicht, welchen Fehler ich im PHPLDAPscript habe?
 
was sagen denn die logs vom apache und vom ldap?

habe auch ein ldap laufen und verwende ein php-script um es auf den phones zu publizieren. Läuft ohne probleme.
Könnte es vielleicht an der authentifizierung liegen? So wie ich das jetzt überblicke wird keine anmeldung vorgenommen.

Bsp.:
PHP:
$ldaphost = "127.0.0.1";
$binddn = "uid=admin,dc=domain,dc=de";
$upasswd = "passwd";


$ds = ldap_connect($ldaphost, $ldapport) or die("Could not connect to $ldaphost");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$ldapbind = ldap_bind($ds, $binddn, $upasswd) or die("Could not bind to $ldaphost");
 
Zuletzt bearbeitet:
An der Authentifizierung dürfte es nicht liegen, lesender zurgiff ist dort erlaubt. Wie gesagt bei mir erscheint das zweite Menü ab
PHP:
 } else {
        if (!isset($entry)) {
        print ("<CiscoIPPhoneMenu>\n");
        print ("<Title>Suchergebnis</Title>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
        $ds=ldap_connect("localhost");

                if ($ds) {
nicht, sonder es erscheint erneut die erste Eingabemakse der Suchanfrage.
Kommentiere ich oben im code das "} else {" läuft auch eine anfrage an den Sladp.
Ansonsten liegen im Apache keine Errorlogs sondern nur ein Accesslog mit der Übermittlung der Suchanfrage ( GET ...?suchwet=gugug )

Kannst du mal bitte deinen PHPcode posten ?
 
dann hilft nur ein schritt für schritt debug.
Kannst es ja auch erst mal mit dem browser testen, dann spielt die xml-syntax erst mal keine rolle.

was du noch versuchen kannst
if($suchwert==null){

bzw.

if(!isset($suchwert)){

Wenn das nichts bring gib doch einfach mal die Variable aus.


Bei gelegenheit kann ich auch mal meinen code schicken
 
Zuletzt bearbeitet:
Kostenlos!

Statistik des Forums

Themen
248,915
Beiträge
2,304,948
Mitglieder
378,626
Neuestes Mitglied
0xFaB1