Outils personnels

Accès GLPI à partir d'une application externe (PHP) : Différence entre versions

De wikiGite

(Code PHP)
 
(13 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
A ce jour (GLPI 0.83), la méthode la plus simple est de passer par le WebService (module GLPI : http://plugins.glpi-project.org/spip.php?article93), par XMLRPC (SOAP trop spécifique, REST pas assez stable).
+
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).
  
 
== Installation ==
 
== Installation ==
 
=== Sur le serveur GLPI ===
 
=== Sur le serveur GLPI ===
Si ça n'a pas déjà été fait pour le module Shinken par exemple, installer le module WebServices
+
Si ça n'a pas déjà été fait pour le module Shinken par exemple, installer le plugin WebServices
 
  [[Le_plugin_Monitoring#Plugin_WebServices]]
 
  [[Le_plugin_Monitoring#Plugin_WebServices]]
  
=== Sur le serveur de l'application cliente (testé sur CentOS) ===
+
=== Sur le serveur de l'application cliente (testé sur CentOS, dépôt [[D%C3%A9p%C3%B4ts_compl%C3%A9mentaires#REMI | Remi Collet]] pour une version PHP à jour) ===
yum install --enablerepo=remi php-xmlrpc
+
yum install --enablerepo=remi php-xmlrpc
/etc/init.d/httpd reload
+
/etc/init.d/httpd reload
  
 
== Utilisation ==
 
== Utilisation ==
Ligne 16 : Ligne 16 :
 
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).
 
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 ===
 
=== Test et validation de l'installation de xmlrpc ===
 
copier /var/www/glpi/plugins/webservices/scripts/testxmlrpc.php du serveur GLPI vers le serveur client.
 
copier /var/www/glpi/plugins/webservices/scripts/testxmlrpc.php du serveur GLPI vers le serveur client.
Ligne 21 : Ligne 22 :
 
Exemples d'utilisation de testxmlrpc.php :
 
Exemples d'utilisation de testxmlrpc.php :
 
  php testxmlrpc.php --help
 
  php testxmlrpc.php --help
  php testxmlrpc.php --method=glpi.doLogin --login_password=pass --login_name=User
+
  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 :
 
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
 
  + Calling 'glpi.doLogin' on http://localhost//glpi/plugins/webservices/xmlrpc.php
Ligne 33 : Ligne 34 :
 
  )
 
  )
  
 +
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
 
  php testxmlrpc.php '''--session=bu9efhcupbvlsvuk2bto52q9p4''' --method=glpi.listDropdownValues --dropdown=TicketType
On récupère ici un tableau avec tous les types de tickets déclarés dans GLPI.
 
  
==== Code PHP ====
+
=== Code PHP ===
 
Dans une page PHP, on appelle directement les fonctions GLPI.
 
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 :
 
Equivalent du login réalisé ci-dessus avec testxmlrpc.php :
Ligne 54 : Ligne 60 :
 
     }
 
     }
 
   
 
   
     if ($result = call_glpi($args)) {
+
     if ($result = '''call_glpi($args))''' {
 
       return $result['session'];
 
       return $result['session'];
 
     }
 
     }
 
  }
 
  }
 
La fonction call_glpi() a cette forme :
 
La fonction call_glpi() a cette forme :
function call_glpi($args) {
+
function call_glpi($args) {
   global $host,$url,$deflate,$base64;
+
   global '''$host,$url,$deflate,$base64''';
 
   
 
   
 
   // To avoid IDE warning
 
   // To avoid IDE warning
Ligne 73 : Ligne 79 :
 
   
 
   
 
   $header = "Content-Type: text/xml";
 
   $header = "Content-Type: text/xml";
 
+
 
   if (isset($deflate)) {
 
   if (isset($deflate)) {
 
       $header .= "\nAccept-Encoding: deflate";
 
       $header .= "\nAccept-Encoding: deflate";
Ligne 111 : Ligne 117 :
 
   }
 
   }
 
  }
 
  }
 +
Les variables globales reprises en début de fonction sont bien sûr à remplir avec des valeurs adéquates.
  
 
== Documentation ==
 
== Documentation ==

Version actuelle datée du 24 août 2012 à 14:38

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).

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 :

https://forge.indepnet.net/projects/webservices/wiki/