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 2016-04-01 23:21:03

cyril.colin
Member
Registered: 2015-08-24
Posts: 32

disparition des connexion apres maj 1.2

Depuis la mise a jour 0.90+1.2 mes connexions d'écrans aux ordinateurs ont disparus
Est ce d'autres ont remarqué ce probleme?
Et comment puis le resoudre ?

Offline

#2 2016-04-05 09:55:17

Drakko
Member
Registered: 2015-11-04
Posts: 73

Re: disparition des connexion apres maj 1.2

Salut,

j'ai l'impression que je n'ai pas perdu ce lien. Tu veux dire que si tu vas dans moniteur, quand tu regardes connexions, tu vois l'ordinateur auquel il est rattaché ?

(par contre, j'ai perdu tous les critères des groupes d'ordinateurs dynamiques)

Offline

#3 2016-04-13 17:59:22

kevinG
Member
From: Paris
Registered: 2014-02-26
Posts: 423

Re: disparition des connexion apres maj 1.2

Bonjour

J'ai le même problème.

Les inventaires ne font plus le lien avec les écrans. J'utilise les agents 2.3.17 et 2.3.13.
Dans l'historique on voit bien qu'il fait la suppression du lien mais il ne le refait jamais.

Les règles sur les moniteurs update et import sont bien activées.

En regardant dans l'onglet "Informations d'importation" sur "ordinateur",  puis dans la partie "monitor", on ne voit pas le numéro de série. Dans la version de FI 0.84+3.5, cela est visible.
Par contre, si je regarde le fichier XML attaché, je vois bien le numéro de série de l'écran entre les balises "<SERIAL>" et "</SERIAL>".

Y a-t-il un correctif ?

Le problème est-il déjà ouvert sur Github ?


Version en production GLPI 9.4.5 - Agent FI 2.5
Version en production Fusion Inventory 9.4+2.4
Version PHP 7.2.16
Zend Engine v3.2.0 - Zend OPcache v7.2.16

Offline

#4 2016-05-04 09:15:48

kevinG
Member
From: Paris
Registered: 2014-02-26
Posts: 423

Re: disparition des connexion apres maj 1.2

UP car le problème est toujours existant et très gênant (plus de 3000 écrans dans la nature).

Le passage en 0.90 serait très intéressant mais je ne peux pas me permettre de perdre plus de 3000 matériels donc celle-ci reste en teste.

Je vais regarder le code, mais serait-il possible d'avoir des pistes sur les pages de code à regarder ?


Version en production GLPI 9.4.5 - Agent FI 2.5
Version en production Fusion Inventory 9.4+2.4
Version PHP 7.2.16
Zend Engine v3.2.0 - Zend OPcache v7.2.16

Offline

#5 2016-05-13 12:34:06

kevinG
Member
From: Paris
Registered: 2014-02-26
Posts: 423

Re: disparition des connexion apres maj 1.2

Bonjour,

J'ai enfin trouvé d'où vient le bug car je pense que s'en est un.

Il vient du verrouillage du champ "Numéro de série" du type de matériel "ordinateur".
Donc soit en verrouillant directement le champ sur le matériel puis dans l'onglet "Verrous (champs)" ou en allant dans "Plugins => FusionInventory => Général => configuration générale => Verrous (champs)".

Je sais, on parle des moniteurs et non des ordinateurs. Mais après une analyse du code, il y a lien.

Donc afin de régler ce problème soit on modifie le code soit on déverrouille le champ "numéro de série" des ordinateurs. Personnellement, je vais utiliser la modification du code. Je donnerai plus bas ma solution.

Je vais expliquer ce lien (où essayer au moins).

Le problème se trouve dans le fichier "formatconvert.class.php" se trouvant dans le répertoire "\plugins\fusioninventory\inc\".
C'est la fonction "replaceids" qui génère l'anomalie.

function replaceids($array, $itemtype, $items_id)

Dans cette fonction, on a 3 arguments. Celui qui va nous intéressé pour la suite est "$itemtype" (si on veut aller plus loin il aura peut être aussi "$items_id"). Donc pour une remontée d'inventaire d'un ordinateur on a $itemtype= 'computer'

Au tout début de cette fonction, on va chercher les champs verrouillés pour le type de matériel passé en paramètre.

$a_lockable = PluginFusioninventoryLock::getLockFields(getTableForItemType($itemtype),
                                                             $items_id);

Ensuite, on boucle sur le tableau contenant toutes les données envoyées par l'agent d'inventaire.
Si on tombe sur un nouveau tableau on appelle à nouveau cette fonction en passant toujours le type de matériel en paramètre "$itemtype".

$array[$key] = $this->replaceids($value, $itemtype, $items_id);

Or "$itemtype" est toujours égale à "computer". A aucun endroit, dans cette fonction, on change la valeur de cette variable. Et c'est elle qu'on passe en paramètre dans la récursivité de cette fonction. Donc quelque soit le type de matériel dans les données, on considère que c'est un "computer".
Et si on a verrouillé le champ "numéro de série" des ordinateurs, la variable "$a_lockable" de type "array" contient une clé "serial".

Ensuite lorsque l'on est dans la boucle d'un moniteur, on fait le test suivant :

if (!PluginFusioninventoryLock::isFieldLocked($a_lockable, $key)){
....(écriture du code si la condition est vraie)
} else {
..... (écriture du code si la condition est fausse)
}

Or la clé "$key" contenant le numéro de série d'un moniteur se nomme "serial" dans le code.
Donc lors de la vérification si le champ est verrouillé on obtient la réponse "oui". Et vu qu'elle est inversée avec "!". Le test est donc négatif, on passe donc dans le "else".

else {
    unset($array[$key]);
}

Cela supprime la clé "serial" du moniteur dans les données reçuent. Donc pour la suite du traitement, il ne peut rien faire vu que le numéro de série à disparu.

N'étant pas dans l'équipe de développement du plugin, je ne connais pas les contraintes, ni les choix, ni les conséquences de débloquer cela pour tous les types de matériels attachés (carte réseau, graphique, lecteur carte, ...).
J'ai donc ajouté du code pour contourner uniquement le problème des écrans. Je pense qu'il y a une meilleure solution.

Pour ceux que ca intéresse, voici la fonction modifiée :

  function replaceids($array, $itemtype, $items_id,$itemtype_recursif='') {
      global $CFG_GLPI;

      $a_lockable = PluginFusioninventoryLock::getLockFields(getTableForItemType($itemtype),
                                                             $items_id);

      foreach ($array as $key=>$value) {
         if (!is_int($key)
                 && ($key == "software"
                     || $key == 'ipaddress'
                     || $key == 'internalport')) {
            // do nothing
         } else {
            //if (is_array($value)) {
            if ((array)$value === $value) {
                    if ($itemtype_recursif != 'monitor')
                    {
                        $itemtype_recursif = $key;
                    }
               $array[$key] = $this->replaceids($value, $itemtype, $items_id, $itemtype_recursif );
            } else {
               if ((!PluginFusioninventoryLock::isFieldLocked($a_lockable, $key)) || ($itemtype_recursif == 'monitor')) {
                  if (!is_numeric($key)
                          && ($key == "manufacturers_id"
                              || $key == 'bios_manufacturers_id')) {
                     $manufacturer = new Manufacturer();
                     $array[$key]  = $manufacturer->processName($value);
                     if ($key == 'bios_manufacturers_id') {
                        $this->foreignkey_itemtype[$key] =
                                 getItemTypeForTable(getTableNameForForeignKeyField('manufacturers_id'));
                     } else {
                        if (isset($CFG_GLPI['plugin_fusioninventory_computermanufacturer'][$value])) {
                           $CFG_GLPI['plugin_fusioninventory_computermanufacturer'][$value] = $array[$key];
                        }
                     }
                  }
                  if (!is_numeric($key)) {
                     if ($key == "bios_manufacturers_id") {
                        $array[$key] = Dropdown::importExternal($this->foreignkey_itemtype['manufacturers_id'],
                                                                $value);
                     } else if ($key == "locations_id") {
                        $array[$key] = Dropdown::importExternal('Location',
                                                                $value,
                                                                $_SESSION["plugin_fusioninventory_entity"]);
                     } else if (isset($this->foreignkey_itemtype[$key])) {
                        $array[$key] = Dropdown::importExternal($this->foreignkey_itemtype[$key],
                                                                $value,
                                                                $_SESSION["plugin_fusioninventory_entity"]);
                     } else if (isForeignKeyField($key)
                             && $key != "users_id") {
                        $this->foreignkey_itemtype[$key] =
                                    getItemTypeForTable(getTableNameForForeignKeyField($key));
                        if ($key == 'computermodels_id') {
                           if (isset($CFG_GLPI['plugin_fusioninventory_computermanufacturer'])) {
                              $manufacturer = current($CFG_GLPI['plugin_fusioninventory_computermanufacturer']);
                              $array[$key] = Dropdown::importExternal($this->foreignkey_itemtype[$key],
                                                                      $value,
                                                                      $_SESSION["plugin_fusioninventory_entity"],
                                                                      array('manufacturer' => $manufacturer));
                           } else {
                              $array[$key] = 0;
                           }
                        } else {
                           $table = getTableForItemType($this->foreignkey_itemtype[$key]);
                           $array[$key] = Dropdown::importExternal($this->foreignkey_itemtype[$key],
                                                                   $value,
                                                                   $_SESSION["plugin_fusioninventory_entity"]);
                        }
                     }
                  }
               } else {
                  unset($array[$key]);
               }
            }
         }
      }
      return $array;
   }

Les modifications apportées concernent les lignes :
1706 : avec l'ajout d'un argument facultatif "$itemtype_recursif" pour ne pas bloquer d'autre appel à la fonction.

function replaceids($array, $itemtype, $items_id,$itemtype_recursif=''){

1721 : ajout de 4 lignes pour retenir quand on est dans les écrans. On perd le type de matériel quand on rentre dans la partie des moniteurs

if ($itemtype_recursif != 'monitor')
                    {
                        $itemtype_recursif = $key;
                    }

La partie de des moniteurs se trouve dans le premier tableau avec la clé "monitor". Les données se trouvant dedans sont des tableaux comportant plusieurs clés dont le numéro de série. Et vu que l'on appelle cette même fonction récursivement on perd l'information "monitor" si on ne la mémorise pas, d'où la variable "$itemtype_recursif"

1725 (après ajout des lignes ci-dessus) : On passe en paramètre la variable "$itemtype_recursif"

$array[$key] = $this->replaceids($value, $itemtype, $items_id, $itemtype_recursif );

1727 (après ajout des lignes ci-dessus) : On fait le traitement si "$itemtype_recursif" est "monitor" que les champs soient verrouillés ou non OU si les champs ne sont pas verrouillés pour les autres types de matériel.

if ((!PluginFusioninventoryLock::isFieldLocked($a_lockable, $key)) || ($itemtype_recursif == 'monitor')) {

Version en production GLPI 9.4.5 - Agent FI 2.5
Version en production Fusion Inventory 9.4+2.4
Version PHP 7.2.16
Zend Engine v3.2.0 - Zend OPcache v7.2.16

Offline

#6 2016-05-23 14:08:40

cyril.colin
Member
Registered: 2015-08-24
Posts: 32

Re: disparition des connexion apres maj 1.2

J'ai effectué les mofication vu sur le post suivant.

Le problème a l'air résolu, je n'ai plus de disparition

Offline

Board footer

Powered by FluxBB