Accès GLPI à partir d'une application externe (PHP)
De wikiGite
A ce jour (GLPI 0.83), la méthode la plus simple est de passer par le plugin WebServices (http://plugins.glpi-project.org/spip.php?article93), par XMLRPC (SOAP trop spécifique, REST pas assez stable).
Sommaire
[masquer]Installation
Sur le serveur GLPI
Si ça n'a pas déjà été fait pour le module Shinken par exemple, installer le plugin WebServices
Le_plugin_Monitoring#Plugin_WebServices
Sur le serveur de l'application cliente (testé sur CentOS, dépôt Remi Collet pour une version PHP à jour)
yum install --enablerepo=remi php-xmlrpc /etc/init.d/httpd reload
Utilisation
Autorisation d'accès à GLPI
Pour autoriser le serveur client à se connecter sur le serveur GLPI, aller dans Plugins / WebService dans l'interface GLPI.
Par le "+" de la barre d'outils, déclarer une nouvelle connexion autorisant l'adresse IP du serveur client (dans "Plage d'adresses IPv4", mettre la même adresse 2 fois s'il est le seul àse connecter à l'avenir).
Si on oublie cette autorisation, le test ci-dessous indiquera "Accès refusé".
Test et validation de l'installation de xmlrpc
copier /var/www/glpi/plugins/webservices/scripts/testxmlrpc.php du serveur GLPI vers le serveur client.
Exemples d'utilisation de testxmlrpc.php :
php testxmlrpc.php --help php testxmlrpc.php --method=glpi.doLogin --login_name=User --login_password=pass
On obtient en retour un tableau de valeur, la plus importante étant "session" réutilisée pour les appels suivants :
+ Calling 'glpi.doLogin' on http://localhost//glpi/plugins/webservices/xmlrpc.php + Response: Array ( [id] => 9 [name] => User [realname] => [firstname] => [session] => bu9efhcupbvlsvuk2bto52q9p4 )
On récupère ici, par exemple, un tableau avec tous les types de tickets déclarés dans GLPI :
php testxmlrpc.php --session=bu9efhcupbvlsvuk2bto52q9p4 --method=glpi.listDropdownValues --dropdown=TicketType
Code PHP
Dans une page PHP, on appelle directement les fonctions GLPI.
On s'assure d'abord que le module xmlrpc est activé dans PHP :
if (!extension_loaded("xmlrpc")) { die("Extension xmlrpc not loaded\n"); }
Equivalent du login réalisé ci-dessus avec testxmlrpc.php :
function login() { global $glpi_user, $glpi_pass, $ws_user, $ws_pass; $args['method'] = "glpi.doLogin"; $args['login_name'] = $glpi_user; $args['login_password'] = $glpi_pass; if (isset($ws_user)) { $args['username'] = $ws_user; } if (isset($ws_pass)) { $args['password'] = $ws_pass; } if ($result = call_glpi($args)) { return $result['session']; } }
La fonction call_glpi() a cette forme :
function call_glpi($args) { global $host,$url,$deflate,$base64; // To avoid IDE warning $http_response_header = ; echo "+ Calling {$args['method']} on http://$host/$url\n"; if (isset($args['session'])) { $url_session = $url.'?session='.$args['session']; } else { $url_session = $url; } $header = "Content-Type: text/xml"; if (isset($deflate)) { $header .= "\nAccept-Encoding: deflate"; } if (isset($base64)) { $args['base64'] = $base64; } $request = xmlrpc_encode_request($args['method'], $args); $context = stream_context_create(array('http' => array('method' => "POST", 'header' => $header, 'content' => $request))); $file = file_get_contents("http://$host/$url_session", false, $context); if (!$file) { die("+ No response\n"); } if (in_array('Content-Encoding: deflate', $http_response_header)) { $lenc = strlen($file); echo "+ Compressed response : $lenc\n"; $file = gzuncompress($file); $lend = strlen($file); echo "+ Uncompressed response : $lend (".round(100.0*$lenc/$lend)."%)\n"; } $response = xmlrpc_decode($file); if (!is_array($response)) { echo $file; die ("+ Bad response\n"); } if (xmlrpc_is_fault($response)) { echo("xmlrpc error(".$response['faultCode']."): ".$response['faultString']."\n"); } else { return $response; } }
Les variables globales reprises en début de fonction sont bien sûr à remplir avec des valeurs adéquates.
Documentation
Wiki développeurs WebServices :