Den CUCM 6 mit AXL anzapfen

cathore

Neuer User
Mitglied seit
12 Jul 2006
Beiträge
43
Punkte für Reaktionen
0
Punkte
0
Hallo,
es wurde hier zwar schonmal bezüglich PHP und AXL beim Callmanager gefragt, aber ich probiere es noch einmal. Vielleicht haben da andere schon ein wenig mehr Erfahrung als ich.

Ich bin momentan auf folgendem Stand und habe das dazugehörige Problem:
PHP:
<?php
error_reporting(E_ALL);
$soap_out = "";

$xml_data = '
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SOAP-ENV:Body>
        <axl:getPhone xmlns:axl="http://www.cisco.com/AXL/1.0" xsi:schemaLocation="http://www.cisco.com/AXL/1.0 http://ccmserver/schema/axlsoap.xsd"  sequence="1234">
            <phoneName>SEP0014F20F7AB4</phoneName>
        </axl:getPhone>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
';
$credentials = "XXX:XXX";
$soap_out .= "Host: 192.168.252.200:8443/axl/\r\n";
$soap_out .= "Accept: text/*\r\n";
$soap_out .= "Authorization: Basic ".base64_encode($credentials)."\r\n";
$soap_out .= "Content-Type: text/xml\r\n";
$soap_out .= "SOAPAction: CUCM:DB ver=6.0" . "\r\n";
$soap_out .= "Content-length: ".strlen($xml_data) . "\r\n";
$soap_out .= "Connection: Keep-Alive\r\n";
$soap_out .= $xml_data . "\n";

$client = new soapclient('https://192.168.252.200:8443/axl/');
$client->setCredentials('XXX','XXX','Basic');
$client->send($soap_out,'CUCM:DB ver=6.0',30,30,'');

echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
?>

Meines erachtens alles richtig!
Hier die Fehlermeldung:

Warning: SoapClient::__construct(https://192.168.252.200:8443/axl/) [function.--construct]: failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in C:\Programme\xampp\htdocs\nusoap\lib\http_post.php on line 25

Warning: SoapClient::__construct() [function.--construct]: I/O warning : failed to load external entity "https://192.168.252.200:8443/axl/" in C:\Programme\xampp\htdocs\nusoap\lib\http_post.php on line 25

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://192.168.252.200:8443/axl/' in C:\Programme\xampp\htdocs\nusoap\lib\http_post.php:25 Stack trace: #0 C:\Programme\xampp\htdocs\nusoap\lib\http_post.php(25): SoapClient->__construct('https://192.168...') #1 {main} thrown in C:\Programme\xampp\htdocs\nusoap\lib\http_post.php on line 25

Die betroffene Zeile ist diese hier:
PHP:
$client = new soapclient('https://192.168.252.200:8443/axl/');

Der AXL Service ist gestartet und ich habe ihn auch schon ein paar mal neu gestartet. Ich habe diverse Benutzer ausprobiert, die alle auch CCM Super User waren, um auf die AXL Dienste zuzugreifen. Selbst der eigentliche Server Administrator funktioniert nicht. Habe ich vielleicht im CUCM noch irgendwas vergessen? Oder ist mein PHP Code fehlerhaft?

Vielen vielen Dank für eure Hilfe
Gruss
Christian
 
....


Der Port darf in der URL nicht mit angegeben werden:

$client = new SoapClient(NULL, array (
"location" => "http://$axlhost/axl/",
"uri" => "http://www.cisco.com/AXL/1.0",
...


Gruß,
Marcus
 
Also die Authentisierung scheint nun zu klappen. Allerdings erhalte ich bei jeglicher Art von Request eine XML Prolog Fehlermeldung.
Anbei nochmal meine XML Datei und der geänderte PHP-Code:

PHP:
<?php
include ("class.nusoap_base.php");
include ("class.soap_parser.php");
include ("class.soap_transport_http.php");
include ("class.soapclient.php");
$credentials = "axldev:abcdef";
//Request
		// Read the XML to send to the Web Service
        $request_file = "SampleRequest.xml";
        $fh = fopen($request_file, 'r');
        $xml_data = fread($fh, filesize($request_file));
        fclose($fh);
$soap_out = "";
$soap_out .= "Host: https://192.168.252.200:8443/axl/ HTTP/1.1\r\n";
$soap_out .= "Accept: text/*\r\n";
$soap_out .= "Authorization: Basic ".base64_encode($credentials)."\r\n";
$soap_out .= "Content-Type: text/xml;charset=utf-8\r\n";
$soap_out .= "SOAPAction: CUCM:DB ver=6.0" . "\r\n";
$soap_out .= "Content-length: ".strlen($xml_data)."\r\n";
$soap_out .= "Connection: Keep-Alive\r\n";
$soap_out .= $xml_data . "\n";
$options = array(
'uri' => 'http://www.cisco.com/AXL/1.0',
'location' => 'http://192.168.252.200/axl/',
'xml_encoding' => 'UTF-8');
$client = new nusoap_client('http://192.168.252.200/axl/', $options);
$client->setCredentials('axldev','abcdef','basic');
$client->send($soap_out,'CUCM:DB ver=6.0',30,30,'');
$err = $client->getError();
if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
//echo $client->response;
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
//echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

SampleRequest.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>    
        <axlapi:executeSQLQuery sequence="1" xmlns:axlapi="http://www.cisco.com/AXL/API/1.0" xmlns:axl="http://www.cisco.com/AXL/API/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cisco.com/AXL/API/1.0 axlsoap.xsd">
            <sql>SELECT count(*) as number from numplan</sql>
        </axlapi:executeSQLQuery>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Als Response vom Server erhalte ich folgende Antwort:

Code:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONIDSSO=8C1B17AEE12BEC4CB2867AE6C7F3BE64; Path=/
Set-Cookie: JSESSIONID=155D382E90651E9CCB70CD9FA30E4AA6; Path=/axl; Secure
SOAPAction: "CUCM:DB ver=6.0"
Content-Type: text/xml;charset=utf-8
Content-Length: 525
Date: Thu, 10 Apr 2008 13:44:40 GMT

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header/><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Client</faultcode><faultstring>Content is not allowed in prolog.</faultstring><detail><axl:Error xmlns:axl="http://www.cisco.com/AXL/API/6.0"><axl:code>5001</axl:code><axl:message>Content is not allowed in prolog.</axl:message><request/></axl:Error></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

Vielleicht kannst du ja mal dein Script als Beispiel posten Stom2006...

Vielen dank schonmal
Christian
 
...
Kann es sein, dass du soap (nativ) und nusoap einwenig "gemischt" betreibst?


...

Gruß,
Marcus
 
Ich versteh nicht ganz was du meinst?
Ist das erste mal das ich mit dem Thema Soap überhaupt etwas zu tun habe.
 
...

Code im ersten Post:
PHP:
$client = new soapclient('https://192.168.252.200:8443/axl/');

Nativ SOAP PHP würde ich sagen.


Zweiter POst:

PHP:
include ("class.nusoap_base.php");
include ("class.soap_parser.php");
include ("class.soap_transport_http.php");
include ("class.soapclient.php"); 
...
$client = new nusoap_client('http://192.168.252.200/axl/', $options);

Das ganze mit nusoap?

...

Gruß,
Marcus
 
Geschafft!!

Vielen Dank für deine :)groesste:) Hilfe, nachdem du das geschrieben hast mit Nativ und NuSoap, habe ich nochmal genauer nachgeschaut.

Siehe da, ich habs nun geschafft.

Authentisierung und abfragen funktionieren.

Danke danke danke nochmal

Gruss
Christian
 
Ich hatte dieses Problem vor Monaten auch, habs dann aber aufgegeben und mit Java gemacht.

Jetzt ist eine PHP-Lösung aber fast zwingend möglich, da ich zu viele Daten an PHP übergeben und dort weiter bearbeiten muss.

Ich komme mit Hilfe der Scripte schon viel weiter wie mit meinen Versuchen, bleibe aber auch an der Fehlermeldung "Content is not allowed in prolog" hängen.

Der Hinweis mit soap bzw. nusoap hat mir leider nicht geholfen, was steckt da im Detail dahinter?

Wäre echt dankbar, wenn ich das Thema endlich lösen könnte, weil mich das schon seit Monaten aufhält.
 
...


Der Hinweis Soap / Nusoap habe ich gegeben, da cathore in seinen Versuchen "wechselweise" einam mit native SOAP und einmal mit Nusoap gearbeitet hat.

Und ich daher nicht wusste wei er es lösen will und mit welche der beiden Lösungen.

Welchen CM hast du denn und was willst du machen?

Gruß,
Marcus
 
Hi,

also ich hab einen CCUM 6 und möchte alle "Enduser" auslesen.
Mit dem Cisco-Java-Beispiel, bzw. einer Modifikation davon, klappt das wunderbar.

Das Problem ist aber, dass ganze läuft auf einem Webserver und wir machen normalerweise alles mit PHP. Es wäre daher gut, auch die AXL-Abfrage in PHP zu realisieren.

Ich hatte Anfang des Jahres versucht, dass ganze selber umzuschreiben, kam aber mit dem ganzen Socket-Thema nicht zu recht und kam nicht mal so weit, wie cathore.

Jetzt habe ich durch Zufall diesen Thread gefunden und habe die Hoffnung, es doch in PHP zu schaffen.

Ich bleibe aber aktuell bei dem Fehler stecken, den cathore mit deiner Hilfe lösen konnte. Ich versteh es aber nicht, was du mit der nusoap oder soap Geschichte meinst. Ich weiß das er das beim ersten Beispiel mit soap und im zweiten dann mit nusoap gemacht hat. Aber ich kriegs mit keiner Variante hin.

Eine Idee, was er jetzt geändert hat?

Meine Meldung ist wie gesagt immer: "Content is not allowed in prolog"
Das kommt wohl schon vom Cisco, wenn ich das richtig sehe.
 
...

Alle User "holen" würde ich spontan nicht mit AXL machen sondern direkt mit PHP/LDAP. Ich gehe mal davon aus, dass das mit dem 6.x auch noch geht. Müsste ich aber im Lab mal testen.

Gruß,
Marcus
 
Soweit ich weiß, geht das wohl nicht mehr und die AXL Geschichte wäre das einfachste, weil ich dann einen XML-String mit allen Informationen bekomme.

Außerdem benötige ich AXL z.B. für die Authentifizierung und daher würde sich das darüber anbieten.

Mit Java wie gesagt tut alles, ist aber umständlich und die Schnittstelle zwischen Java und PHP finde ich nicht sinnvoll. Ich versteh nur mein PHP-Skript nicht und auch das von cathore liefert Fehler, die ich nicht lösen konnte.
 
...


Zeig mal Code / bzw. Fehlermeldung(en)


Gruß,
Marcus
 
Also, ich bekomme vom CUCM 6 alles zurück. Was mir noch fehlt, ist ein Ansatz zum auswerten der XML-Datei die er zurücksendet. Sprich ich muss das XML parsen und entfernen.

Wer meine Lösung haben möchte, einfach eine Email an mich und ich schicke mal das Script zu. Komme diese Woche allerdings nicht zu einer Antwort, da ich beruflich zu sehr eingebunden bin...

Gruss
Cathore
 
Mein Code von letztem Jahr ist müll, daher habe ich es mit cathore probiert.

Ist fast unverändert:

PHP:
<?php
include ("nusoap/class.nusoap_base.php");
include ("nusoap/class.soap_parser.php");
include ("nusoap/class.soap_transport_http.php");
include ("nusoap/class.soapclient.php");

$credentials = "admin:passwort";

//Request
      
        
  		$xml_data = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" ";
		$xml_data .= "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> ";
		
		$xml_data .= "<SOAP-ENV:Body> <axl:getPhone xmlns:axl=\"http://www.cisco.com/AXL/1.0\" ";
		$xml_data .= " xsi:schemaLocation=\"http://www.cisco.com/AXL/1.0 http://45.136.95.198/schema/axlsoap.xsd\">";
		$xml_data .= "<phoneName>SEP001E13E61A84</phoneName>";
		$xml_data .= "</axl:getPhone> </SOAP-ENV:Body> </SOAP-ENV:Envelope>";
        
$soap_out = "";


$soap_out .= "POST /axl/ HTTP/1.0\r\n";
$soap_out .=  "Host:45.136.95.198:8443\r\n";
$soap_out .=  "Authorization: Basic " + authorization + "\r\n";
$soap_out .=  "Accept: text/*\r\n";
$soap_out .=  "Content-type: text/xml\r\n";
$soap_out .=  "SOAPAction: \"CUCM:DB ver=6.0\"\r\n";


$soap_out .= "Content-length: ".strlen($xml_data)."\r\n";
$soap_out .= "Connection: Keep-Alive\r\n\r\n";
$soap_out .= $xml_data . "\n";

$options = array(
	'uri' => 'http://www.cisco.com/AXL/1.0',
	'location' => 'http://45.136.95.198/axl/',
	'xml_encoding' => 'UTF-8');
	
$client = new SoapClient('http://45.136.95.198/axl/', $options);
$client->setCredentials('admin','passwort','basic');
$client->send($soap_out,'CUCM:DB ver=6.0',30,30,'');
$err = $client->getError();

if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}

//echo $client->response;
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
//echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';


echo '<br><br>-------<br>';
echo '<pre>' . htmlspecialchars($soap_out, ENT_QUOTES) . '</pre>';
?>


Die Server-Antwort:

Code:
Request
POST /axl/ HTTP/1.0
Host: 45.136.95.198:8443
User-Agent: NuSOAP/0.7.3 (1.51)
Content-Type: text/xml; charset=ISO-8859-1
SOAPAction: "CUCM:DB ver=6.0"
Authorization: Basic SAdhue3zjsdj28d
Content-Length: 599

POST /axl/ HTTP/1.0
Host:45.136.95.198:8443
0Accept: text/*
Content-type: text/xml
SOAPAction: "CUCM:DB ver=6.0"
Content-length: 432
Connection: Keep-Alive

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <axl:getPhone xmlns:axl="http://www.cisco.com/AXL/1.0"  xsi:schemaLocation="http://www.cisco.com/AXL/1.0 http://45.136.95.198/schema/axlsoap.xsd"><phoneName>SEP002E13A54A24</phoneName></axl:getPhone> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

Response
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONIDSSO=2DAFA12BBFD260D134A14DA8E5452C3A; Path=/
Set-Cookie: JSESSIONID=BAF22B2ECB4805816243D0DCF07567BA; Path=/axl; Secure
SOAPAction: "CUCM:DB ver=6.0"
Content-Type: text/xml;charset=utf-8
Content-Length: 525
Date: Tue, 03 Jun 2008 09:25:45 GMT

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header/><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Client</faultcode><faultstring>Content is not allowed in prolog.</faultstring><detail><axl:Error xmlns:axl="http://www.cisco.com/AXL/API/6.0"><axl:code>5001</axl:code><axl:message>Content is not allowed in prolog.</axl:message><request/></axl:Error></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>


Per Java tut alles!

Die XML-Parser Geschichte muss ich natürlich auch machen.
Bisher nur einzelne Auswertungen, sobald ich aber weiß, ob es mit PHP funktioniert (hoffentlich), werde ich das stark erweitern müssen. Das kann ich dann auch hier posten.
 
so ganz blick ich da noch net durch...mit diesem axl-bsp was der ccm so dabei hat..wo man über diese nette java-zeile auslesen und verändern kann...klappt ja wunderbar...

doch die php sache..bereitet mir noch probleme...nur zum verständnis..

über diese xml_data...führe ich auf dem ccm nen befehl (update oder select als bsp) aus?

wenn ich das oben genannte php ausführe...schimpft er mich folgendes aus

Constructor error

HTTP Error: The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to included cURL.

nen request und nen response bekomme ich allesdings zurück...aber den xml_data gibt er auch als text aus...und net die info's die man eigentlich haben will....

mir wäre es schon recht..wenn ich statt dem java-zeugs...... das ganze über php hinbekommen würde..aber wie geschrieben..an ein paar ecken...stösst man sich noch ;)

was will er mir mit der meldung versuchen zuverdeutlichen?
 
...

kurz zwischen durch

Ich tippe mal auf eine UCM 6.x. Da läuft die AXL Abfrage über https.

HTTP Error: The PHP cURL Extension is required for HTTPS or NLTM. You will need to re-build or update your PHP to included cURL.

Die Fehlermeldung sagt "das dein PHP nur dann HTTPS (SSL) kann" wenn die PHP cURL Extension eingebunden ist.

...
 
Hallo Ihr,

so wie es ausssieht haben einige von Euch schon gute Erfolge mit Java erzielt.
Ich versuche auch gerade mit dem CUCM Kontakt aufzunehmen.
Das GetPhone Beispiel aus der Cisco Dokumentation habe ich schon zum Laufen bekommen.
Nur leider liefert mir diese Abfrage nicht die Informationen, die ich suche.
Ich möchte zu einer Telefonnummer die aktuelle IP des Telefons herausfinden.
Wisst Ihr mit welcher Abfrage ich das bewerkstelligen kann und welche Parameter diese erwartet?

Man kann auch direkt SQL-Abfragen ausführen, aber auch dort weiß ich den Namen der Tabelle, die die von mir gesuchten Informationen enthält nicht.

Vielleicht kennt jemand von Euch auch den Namen der Metatabelle (in der drinsteht, welche Tabellen es alle gibt), dann könnte ich mich durchprobieren.

Ich bin für jede Hilfe dankbar.


Gruß Franz
 
...


Nach meinem Kenntnisstand kann die IP nur über die realtime API abgefragt werden. Aber leider nicht per AXL.

...
 
danke :) nun schaut es besser aus.

wenn das ganze nun so klappt..kann man sich nun ganz normal mit php-sql-befehlen mit der datenbank verbinden? oder ist da auch was besonderes zubeachten?

eine übersicht..mit den ganzen tabellen und feldern..habe ich auf arbeit liegen..kann ich wenn du willst..ja ab montag mal schicken..und glaube blick bei den tabellenverknüpfungen auch shcon etwas mehr durch :)
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,454
Beiträge
2,252,326
Mitglieder
374,206
Neuestes Mitglied
jenniferjemma029
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.