Outils personnels

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

De wikiGite

Révision datée du 22 août 2012 à 14:05 par Frank (discussion | contributions) (Page créée avec « 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... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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

Installation

Sur le serveur GLPI

Si ça n'a pas déjà été fait pour le module Shinken par exemple, installer le module WebServices

[Le_plugin_Monitoring#Plugin_WebServices]

Sur le serveur de l'application cliente (testé sur CentOS)

yum install --enablerepo=remi php-xmlrpc /etc/init.d/httpd reload

Test et validation de l'installation de xmlrpc et des droits d'accès au serveur GLPI :

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_password=pass --login_name=User

--> récupération variableretour["session"]

php testxmlrpc.php --session=cbe5aofr2tcsfnr050s8darpq6 --method=glpi.listDropdownValues --dropdown=TicketType

--> récupération array avec types

Dans une page PHP, on appelle directement les fonctions GLPI.

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;
  }
}

Wiki développeurs WebServices :

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