You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2023-07-13 10:09:37

J2C99
Member
Registered: 2020-08-11
Posts: 112

GLPI-Agent ajout de nouveaux champs.

Bonjour

  Je viens de remarquer une différence de comportement selon que l'agent  s'interface avec le plugin fusioninventory   ou glpiinvnetory.

  Dans mon cas de figure, j'ai besoin de remonter la liste des admins locaux  lors des inventaires fournis par l'agent (j'utilise glpi-agent 1.5).
  J'ai modifié l'agent  de manière que les données soit bien présentes dan le fichier  json / xml généré .

  J'ai deux instances (GLPI 9.5. avec fusioninventory , et GLPI10 avec glpiinentory).
  Tout se passe correctement avec le plugin fusioninventory,  le ficheir xml est bien présent sur le serveur, et les données intégrés
  Avec le plugin glpiinentory, le fichier json n'est pas présent sur le serveur.
  De plus, l'agent log une erreur

[Wed Jul 12 19:51:48 2023][error] [http client] communication error: 500 Internal Server Error, Unhandled schema entry local_admins
[Wed Jul 12 19:51:48 2023][debug2] format: Zlib
[Wed Jul 12 19:51:48 2023][debug2] [http client] 2D6E5BDE: received message:
{"status":"error","message":"Unhandled schema entry local_admins","expiration":24}
[Wed Jul 12 19:51:48 2023][error] [http client] 2D6E5BDE: server error: Unhandled schema entry local_admins

  A première vue,  glpiinentory integre un check de cohérence des données remontés par l'agent.

  Comment fait on pour intégrer de nouveaux champs ?

Last edited by J2C99 (2023-07-13 10:10:25)

Offline

#2 2023-07-13 10:34:44

J2C99
Member
Registered: 2020-08-11
Posts: 112

Re: GLPI-Agent ajout de nouveaux champs.

Le check est présent dans le fichier  src/Inventory/Inventory.php

Dans le switch ,  il faut rajouter un case supplémentaire  (case 'local_admins':)  tout simplement


    final public function processInventoryData()
    {
       //map existing keys in inventory format to their respective Inventory\Asset class if needed.
        foreach ($this->data as $key => &$value) {
            $assettype = false;

            switch ($key) {
                case 'accesslog': //not used
                case 'autoupdatesystems_id': //set on host, ignore - not present in specs
                case 'envs': //not used
..
                default:
                    if (method_exists($this, 'processExtraInventoryData')) {
                        $assettype = $this->processExtraInventoryData($key);
                    }
                    if ($assettype === false) {
                     //unhandled
                        throw new \RuntimeException("Unhandled schema entry $key");
                    }
                    break;

Offline

#3 2023-07-13 10:37:16

gbougard
Moderator
From: Montpellier, France
Registered: 2021-07-21
Posts: 540
Website

Re: GLPI-Agent ajout de nouveaux champs.

Salut J2C99,

GLPI valide les données en se basant sur les specs JSON du fichier inventory.schema.json : https://github.com/glpi-project/inventory_format
Tu retrouveras ce fichier dans le dossier vendor/glpi-project/inventory_format de GLPI.

Si tu commences à toucher à ce fichier, il faudra que tu le maintiennes à chaque montée de version de GLPI.

Si tu as des modifications intéressantes à partager n'hésites pas à proposer des PRs, pour le format, pour l'agent et pourquoi pas GLPI.


GLPI-Agent developer from Teclib' and GLPI-Network team
Previously FusionInventory-Agent maintainer

Offline

#4 2024-01-22 18:36:27

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

hello @gbougard
j'ai donc trouvé la reponse à mes questions smile

Il est vrai que si on ajoute des 'spécificites', forcement lors des maj cela est perdu. (schema json, mais aussi inventory.php)

@j2c99, @gbougard
ok pour ajouter un case supplementaire
mais php etant un peu 'obscur' bien que j'ai developpé plugin, j'aiemrais notamment avec GLPIinventory remonté informations dans ce plugin, comme je le faisais dans FI :
vaut-il mieux creer un repertoire 'plugin' au meme niveau que Asset ou un repertoire 'customer' ?
Merci


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

#5 2024-04-11 16:59:11

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

hello @gbougard

j'ai suivi le processus, mais lors de l'import des données, j'ai une erreur dans le php
[11-Apr-2024 16:51:02 Europe/Paris] PHP Warning:  foreach() argument must be of type array|object, string given in D:\wamp\www\glpi\src\Blacklist.php on line 548
et
[11-Apr-2024 16:51:02 Europe/Paris] PHP Warning:  foreach() argument must be of type array|object, string given in D:\wamp\www\glpi\src\Inventory\Asset\InventoryAsset.php on line 216
           foreach ($value as $key => &$val) {
                if ($val instanceof \stdClass || is_array($val)) {
                    continue;
                }
erreur que je ne comprends pas

est-ce lié au 'format' des données dans le script perl ?
    my $winfo = {
          NAME         =>$W1
    };

    $inventory->addEntry(
    section => 'Winfo',
    entry   => $winfo);
ou autre explication ?

Merci

Last edited by ec2311 (2024-04-11 17:02:33)


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

#6 2024-04-24 10:14:23

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

Bonjour @j2c99, @gbougard

Je poursuis sur ce theme car je ne trouve pas de solution 'viable'.

j'ai un script qui doit me remonter qu'une seule donnée.
Auquel cas je termine mon script agent par ajout de la ligne :
$inventory->{content}{INFOSUPP}=$info; (ce qui me semble etre le cas du script bios qui realise un setbios, fonction developpée dans inventory.pm)

le script tourne sans probleme, et dans le fichier xml je vois bien le contenu de ce INFOSUPP : ok

cependant lors de l'execution en automatique
erreur dans le php.log
-> foreach() argument must be of type array|object, string given in D:\wamp\www\glpi\src\Blacklist.php at line 548
-> foreach() argument must be of type array|object, string given in D:\wamp\www\glpi\src\Inventory\Asset\InventoryAsset.php at line 210

Ce n'est pas un probleme de schema, sinon j'aurais une bad request avec erreur 400

Du coup mon inventaire ne remonte pas sad

En spécifiant un schema différent (tableau) et en modifiant mon script en realisant un addentry : cela fonctionne smile
MAIS
le souci est que je possede des agent GLPI-agents, mais aussi FI
GLPI-agent : envoie en JSON
FI en xml uniquement
Or, quand on spécifie tableau dans le schema json, il attend alors 'n' lignes (n>1) et donc mon inventaire pour un agent FI (et envoie en tableau) ne passe pas.

Est-ce que l'extends que l'on specifie à la classe a son importance ?
je vois que "class bios extends device"
j'ai spécifié "class suppinfo extends inventoryasset"

Merci pour votre aide

Last edited by ec2311 (2024-04-24 14:36:03)


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

#7 2024-04-24 15:21:41

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

A priori l'erreur du blacklist est lié au fait que mon script perl genere du string (que j'ai defini comme tel dans le schema attendu)
il y a l'air d'avoi un mismatch entre le schema et ce que je genere via le script perl
mais je n'ai pas d'erreur sur le schema lui meme.
au niveau blacklist (548)
je vois mes valeurs remontée en type string, et non comme un object (quand je compare aux autres valeurs dans la log)

certaienement un souci de generation dans le script perl : mais je ne vois pas quoi :
înfo contient toutes les valeurs que je souhaite remonter
$inventory->{content}{SUPPINFO}=$info;


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

#8 2024-04-25 16:35:15

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

lorsque je demande tableau : pas de souci.
du coup, comme mon pb vient du xml et que je n'ai qu'un enreg -> el serveur dit non

De ce fait, je repete mon enregistrement dans le cas du FI -> j'ai donc 2 enregistrements générés

et donc en tableau plus de probleme


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

#9 2024-10-08 17:10:49

Dead-Red
Member
From: France - Aisne - 02
Registered: 2021-04-10
Posts: 23

Re: GLPI-Agent ajout de nouveaux champs.

Bonjour à tous,

Nous sommes plusieurs à vouloir faire les mêmes actions, vous serait-il possible de prendre le temps afin de partager votre travail ?

Merci par avance.

Offline

#10 2024-10-23 15:25:33

ec2311
Member
Registered: 2016-04-07
Posts: 353

Re: GLPI-Agent ajout de nouveaux champs.

Bonjour @Dead-red
en fait si on ajoute des informations via l'agent, il faut ajouter format deja cote agent (fichier inventory.pm, se situant C:\Program Files\GLPI-Agent\perl\agent\GLPI\Agent)
Exemple d'ajout :
AJOUT1         => [ qw/NAME VALEUR1 / ]
à mettre à la fin de la liste avec la ponctuation en plus wink

Ajout du script réalisant les taches souhaitées dans repertoire C:\Program Files\GLPI-Agent\perl\agent\GLPI\Agent\Task\Inventory\Win32

En suite, cote serveur i lfaut 'modifier' le schema json attendu
En effet : on ajoute une information, donc le schéma doit etre modifié
Cette description se trouve : ...glpi\vendor\glpi-project\inventory_format et se nomme inventory.schema.json
faire une sauvegarde du schema original wink
Il faut ajouter ainsi la description json ajoutée

Puis
il faut modifier les scripts "d'action"

ces derniers se trouvent dans : \glpi\src\Inventory
Faire une copie de inventory.php
Puis ajouter la description dans la focntion processInventoryData()
ici j'ai declaré un AJOUT1 (précédemment) donc il faudraa ajouter un case : 'ajout1'
en $assettype : spécifier le nom du script qui doit réaliser l'action
Ce(s) script(s) se trouvent : \glpi\src\Inventory\Asset

Par contre j'ai un souci :
Je ne parviens par à recupere l'id de l'ordinateur malgré un
$computers_id = $this->item->fields['id'];
voici ce que contient mon 'item'
s:9:"dohistory";b:1;s:7:"devices";a:0:{}s:13:" * usenotepad";b:1;s:6:"fields";a:0:{}s:5:"input";a:0:{}s:7:"updates";a:0:{}s:9
-> fields est vide : pourquoi ?
(je précise que je fais le test via import manuel)

Last edited by ec2311 (2024-10-23 15:33:30)


GLPI 10.0.10
GLPIinventory 1.3.4

Agents : FI (2.6, 2.5) et Glpiagents (1.7)

Offline

Board footer

Powered by FluxBB