GLPI : générer automatiquement un ticket au changement de statut d’un ordinateur
Suite à une formation donnée sur GLPI dans cette bonne ville de Caen, l’un des stagiaires m’a demandé s’il était possible de générer un ticket au changement de statut d’un ordinateur. En l’occurrence, il s’agissait d’indiquer à ses équipes techniques qu’il fallait changer des ordinateurs obsolètes en créant des demandes automatiquement. Je n’ai pas trouvé de plugin pour réaliser cette basse besogne.
Un script PHP pour automatiser la création de tickets au changement de statut
Comme je n’ai pas le temps d’écrire un plugin (1), j’ai réalisé un script PHP à planifier sur le serveur GLPI avec cron.
<?php /* Copyright © Denis Szalkowski - 19/09/2017 - Version 1.0 - Licence GPL 2 L'objet de ce script est de générer un ticket automatiquement dans GLPI au changement de statut d'un ordinateur. Dans l'exemple ci-dessous, il passe du statut "A changer" à "En attente de changement". */ // Vos paramètres de connexion à la base de données GLPI MySQL/Mariadb $login='root'; $pwd='root'; $host='192.168.1.21'; $db='glpi'; // Tentative de connexion try { $dbh = new PDO("mysql:dbname=$db;host=$host",$login,$pwd); // Choix du codage $dbh->exec("SET CHARACTER SET utf8") or die("Codage inexistant !"); } // En cas d'erreur, fin du script catch(PDOException $e) { die ('Connection impossible : '.$e->message); } // Recherche d'un statut du type "En attente de changement" dans la table glpi_states $sql=" SELECT id,name FROM glpi_states WHERE name='En attente de changement' "; $rows=$dbh->query($sql); // Création du statut, dans l'hypothèse où aucun statut du type "En attente de changement" n'aurait été trouvé if(!$rows->rowCount()) { $sql=" INSERT INTO glpi_states(name,completename,date_mod,date_creation,is_recursive) VALUES('En attente de changement','En attente de changement',NOW(),NOW(),1); "; $dbh->exec($sql) or die("La création de l'état En attente de changement n'a pas pu se faire !"); $state=$dbh->lastInsertId(); } // Dans le cas contraire, on récupère le premier statut existant du type "En attente..." ! else { $row=$rows->fetch(); $state=$row['id']; } // Recherche des ordinateurs - à l'aide des expressions régulières - dont le statut est A changer. $sql=" SELECT c.id AS id,c.name AS name FROM glpi_computers c INNER JOIN glpi_states s ON c.states_id=s.id WHERE s.name = 'A changer' "; $rows=$dbh->query($sql); if(!$rows->rowCount()) { unset($dbh); exit; }; // Création de la liaison Ordinateur-Ticket dans glpi_item_tickets while($row=$rows->fetch()) { // Création de ticket dans glpi_tickets // type=1 représente une demande $computer=$row['id']; $libelle='Ordinateur '.$row['name'].' à changer'; $sql="INSERT INTO glpi_tickets(name,date,date_mod,content,date_creation,type) VALUES('$libelle',NOW(),NOW(),'$libelle',NOW(),1);"; $dbh->exec($sql) or die("Echouage à la création du ticket"); // Récupération du dernier numéro de ticket créé, consécutif à l'insertion précédente $ticket=$dbh->lastInsertId(); // Ajout dans la table liaison Ordinateur-Tickets glpi_item_tickets // items_id désigne, dans le cas présent, l'id de l'ordinateur $sql="INSERT INTO glpi_items_tickets(itemtype,items_id,tickets_id) VALUES('Computer',$computer,$ticket);"; $dbh->exec($sql) or die("Echouage à la création de la liaison ticket-ordinateur"); // Changement de statut de l'ordinateur passant à "En attente ..." $sql="UPDATE glpi_computers SET states_id=$state WHERE id=$computer;"; $dbh->exec($sql) or die("La mise à jour du statut de l'ordinateur passant n'a pas pu se faire"); } unset($dbh); exit; ?>
(1) La documentation est d’ailleurs assez pathétique !