Accès GLPI à partir d'une application externe (PHP)

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

1 Installation
1.1 Sur le serveur GLPI
1.2 Sur le serveur de l'application cliente (testé sur CentOS, dépôt Remi Collet pour une version PHP à jour)
2 Utilisation
2.1 Autorisation d'accès à GLPI
2.2 Test et validation de l'installation de xmlrpc
2.3 Code PHP
3 Documentation

Installation

Sur le serveur GLPI

Si ça n'a pas déjà été fait, installer le plugin WebServices Le_Plugin_WebServices

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 :

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/

Accès GLPI à partir d'une application externe (PHP)

URL : http://wiki.kogite.fr/index.php/Acc%C3%A8s_GLPI_%C3%A0_partir_d'une_application_externe_(PHP)