TP – GLPI (Lecture seule) : Récupérer et classer les tickets via l’API (5 heures) ================================================================================= Niveau : BTS SIO 1re année (SISR/SLAM, bases API & Python) Contexte : On ne MODIFIE PAS GLPI. On LIT les tickets et on les CLASSE côté Python. Sorties attendues : résumé lisible en console + export CSV. ---------------------------------------------------------------------------------- 1) Objectif pédagogique (en une phrase) ---------------------------------------------------------------------------------- Écrire un script Python (lecture seule) qui : 1) s’authentifie à l’API GLPI ; 2) récupère une liste de tickets (avec pagination) ; 3) les classe par statut, priorité, catégorie (et autres critères utiles) ; 4) exporte un fichier CSV propre. ---------------------------------------------------------------------------------- 2) Exigences IMPÉRATIVES du TP ---------------------------------------------------------------------------------- - Utiliser OBLIGATOIREMENT un environnement virtuel : python-venv - Utiliser les bibliothèques suivantes (au minimum) : • requests (HTTP / REST) • python-dotenv (gestion des secrets via fichier .env) - Aucune autre bibliothèque n’est obligatoire. Vous pouvez en ajouter si vous justifiez. - Ne pas commiter de secrets (URL, tokens) en clair dans le code ou le dépôt. ---------------------------------------------------------------------------------- 3) Pré-requis côté plateforme ---------------------------------------------------------------------------------- - Une instance GLPI accessible avec l’API activée : GLPI → Configuration → API → Activer l’API, créer un App Token. Créer un User Token (ou identifiants selon l’instance). - Un poste Debian 13 avec python3, venv et pip installés. ---------------------------------------------------------------------------------- 4) Mise en place de l’environnement (à exécuter en terminal) ---------------------------------------------------------------------------------- 1) Créer le dossier de travail et le venv $ mkdir tp-glpi-read && cd tp-glpi-read $ python3 -m venv .venv $ source .venv/bin/activate 2) Installer les bibliothèques (.venv) $ python -m pip install --upgrade pip (.venv) $ pip install requests python-dotenv 3) Créer un fichier .env (ne pas versionner) avec : GLPI_URL=https://votre-glpi.tld/apirest.php GLPI_APP_TOKEN=xxxxxxxxxxxxxxxx GLPI_USER_TOKEN=yyyyyyyyyyyyyyyy 4) (Option) Créer un README.md minimal (objectif, commandes de lancement). ---------------------------------------------------------------------------------- 5) Spécification fonctionnelle du programme (sans code) ---------------------------------------------------------------------------------- Nom suggéré : glpi_tickets.py Mode : Lecture seule (aucune création/modification côté GLPI). Entrées / Options (arguments CLI à implémenter par vous) : - --glpi-url (défaut : valeur de GLPI_URL dans .env) - --app-token (défaut : valeur de GLPI_APP_TOKEN dans .env) - --user-token (défaut : valeur de GLPI_USER_TOKEN dans .env) - --page-size N (taille de page pour la pagination ; ex : 50) - --max-items N (limiter le nombre total de tickets ; 0 = illimité) - --status S (filtrer par statut exact ; ex : “1”, “2”, “3” selon GLPI) - --min-priority P (filtrer par priorité minimale 1–5) - --since YYYY-MM-DD (ne garder que les tickets créés à partir de cette date) - --csv chemin.csv (chemin du fichier CSV en sortie ; ex : tickets.csv) - --insecure (option pour ignorer la vérification SSL en TP si cert self-signed) Comportement attendu : 1) Charger les variables d’environnement (.env). 2) S’authentifier via l’API GLPI. • Endpoint de base : /apirest.php • Auth recommandée pour le TP : GET /initSession - Headers : App-Token: Authorization: user_token - Réponse : récupérer "session_token" et le mettre dans le header "Session-Token" 3) Récupérer des tickets par pages (pagination). • Approche simple : GET /Ticket?range=OFFSET-LIMIT - Exemple de pagination : range=0-49, range=50-99, etc. - Codes de réponse : 200 ou 206 (partial content) selon versions. • Alternative (si votre instance le demande) : /search/Ticket (plus verbeux, critères côté serveur). 4) Appliquer des filtres côté client si nécessaire (status, priorité, since). 5) Construire un résumé “classement” : • Comptage par statut (IDs → voir section “mappage des statuts”). • Comptage par priorité (et par “bucket” : basse 1–2, moyenne 3, haute 4–5). • Comptage par catégorie (par ID ; ou par libellé si votre instance l’expose). 6) Afficher le résumé au terminal (texte clair, lisible). 7) Exporter un CSV contenant, pour chaque ticket, au minimum : • id • name (ou title) • status (id numérique) • priority (1–5) • priority_bucket (basse/moyenne/haute) • category_id (itilcategories_id) • requester_id (users_id_recipient) – si disponible • assigned_user_id (users_id_assign) – si disponible • creation (date | date_creation) • last_update (date_mod) → Le séparateur CSV sera la virgule “,” ou le point-virgule “;” (au choix). 8) Gérer proprement les erreurs (HTTP 401/403, réseau, JSON inattendu) et afficher un message utile. 9) Respecter une structure de projet soignée (fichiers clairs, README). ---------------------------------------------------------------------------------- 6) Mappage conseillé (à adapter à votre instance GLPI) ---------------------------------------------------------------------------------- - Priorité : entière de 1 (basse) à 5 (haute). Construire un “bucket” : • 1–2 → “basse(1-2)” • 3 → “moyenne(3)” • 4–5 → “haute(4-5)” - Statuts : les IDs varient selon GLPI, mais on retrouve généralement : • 1 = Nouveau / Ouvert • 2 = En cours (attribué) • 3 = En attente • 4 = Résolu • 5 = Clos (Vérifier via l’interface GLPI ou la documentation de l’instance.) ---------------------------------------------------------------------------------- 7) Scénarios de test (à exécuter en fin de TP) ---------------------------------------------------------------------------------- - Test 1 (basique) : Récupérer la première page de tickets, sans filtre → CSV. - Test 2 (filtre priorité) : Ne garder que priorité ≥ 3. - Test 3 (filtre date) : Since = premier jour du mois en cours. - Test 4 (limite) : max-items = 100 pour accélérer les essais. - Test 5 (certificat) : option --insecure si votre GLPI est en self-signed (TP). - Test 6 (résumé) : vérifier que le résumé “statut / buckets de priorité / catégories” correspond aux données du CSV. ---------------------------------------------------------------------------------- 8) Dépannage & vérifications rapides ---------------------------------------------------------------------------------- - API activée ? Token correct ? Tester à la main (depuis le poste) : curl -H "App-Token: XXXXX" -H "Authorization: user_token YYYYY" -k \ https://glpi.votre-domaine.tld/apirest.php/initSession - Codes 401/403 : vérifier App-Token, User-Token, droits de l’utilisateur, activation API. - SSL : en TP, vous pouvez tester avec --insecure, mais en production configurez un certificat valide. - Pagination : si /Ticket ne renvoie pas assez d’infos, basculez sur /search/Ticket (plus flexible pour critères et champs retournés). ---------------------------------------------------------------------------------- 9) Livrables à rendre ---------------------------------------------------------------------------------- 1) Le script (fichiers sources) SANS secrets (.env exclu). 2) Un CSV d’exemple (tickets.csv) généré avec vos options. 3) Une capture d’écran du résumé affiché en console. 4) Un court README (≤ 1 page) : - Contexte et objectif - Commandes pour créer l’environnement venv et installer les libs - Commande(s) pour exécuter le script - Description brève du CSV exporté (colonnes) - Choix de filtres testés et mappage des statuts / priorités ---------------------------------------------------------------------------------- 10) Barème (total : 20 points) ---------------------------------------------------------------------------------- - Connexion & récupération API (pagination ok) .................... 6 pts - Classement & filtres (statut / priorité / catégorie) ............ 6 pts - Résumé lisible + CSV conforme (colonnes propres) ................ 4 pts - Qualité globale (CLI propre, gestion d’erreurs, README) ......... 4 pts ---------------------------------------------------------------------------------- 11) Bonus (facultatif, pour aller plus loin) ---------------------------------------------------------------------------------- - Traduire les IDs de statut en libellés clairs dans l’affichage. - Ajouter un filtre par groupe assigné ou par demandeur. - Générer un CSV “agrégats” (comptes par priorité/statut). - Afficher une petite table alignée en console (sans lib externe obligatoire). Rappels sécurité : - Ne publiez pas vos tokens. - .env doit être ignoré par votre gestionnaire de versions. - Utilisez votre venv à chaque lancement : `source .venv/bin/activate`.