You are not logged in.
Bonjour,
Systématiquement à chaque remontée d'inventaire d'une machine (portable, uc, serveur, ...), le fichier "php-errors.log" se rempli avec les erreurs suivantes :
2016-08-03 16:50:20
Notice(8): Undefined index: virtualmachine_creation
Backtrace :
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerlib.class.php:924 Toolbox::userErrorHandlerNormal()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:532 PluginFusioninventoryInventoryComputerLib->updateComputer()
/var/www/html/glpi/plugins/fusioninventory/inc/inventoryruleimport.class.php:664 PluginFusioninventoryInventoryComputerInventory->rulepassed()
/var/www/html/glpi/inc/rule.class.php:997 PluginFusioninventoryInventoryRuleImport->executeActions()
/var/www/html/glpi/inc/rulecollection.class.php:695 Rule->process()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:350 RuleCollection->processAllRules()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:104 PluginFusioninventoryInventoryComputerInventory->sendCriteria()
/var/www/html/glpi/plugins/fusioninventory/inc/communication.class.php:222 PluginFusioninventoryInventoryComputerInventory->import()
/var/www/html/glpi/plugins/fusioninventory/inc/communication.class.php:438 PluginFusioninventoryCommunication->import()
/var/www/html/glpi/plugins/fusioninventory/front/communication.php:85 PluginFusioninventoryCommunication->handleOCSCommunication()
/var/www/html/glpi/plugins/fusioninventory/index.php:50 include_once()2016-08-03 16:50:20
Warning(2): Invalid argument supplied for foreach()
Backtrace :
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerlib.class.php:924 Toolbox::userErrorHandlerNormal()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:532 PluginFusioninventoryInventoryComputerLib->updateComputer()
/var/www/html/glpi/plugins/fusioninventory/inc/inventoryruleimport.class.php:664 PluginFusioninventoryInventoryComputerInventory->rulepassed()
/var/www/html/glpi/inc/rule.class.php:997 PluginFusioninventoryInventoryRuleImport->executeActions()
/var/www/html/glpi/inc/rulecollection.class.php:695 Rule->process()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:350 RuleCollection->processAllRules()
/var/www/html/glpi/plugins/fusioninventory/inc/inventorycomputerinventory.class.php:104 PluginFusioninventoryInventoryComputerInventory->sendCriteria()
/var/www/html/glpi/plugins/fusioninventory/inc/communication.class.php:222 PluginFusioninventoryInventoryComputerInventory->import()
/var/www/html/glpi/plugins/fusioninventory/inc/communication.class.php:438 PluginFusioninventoryCommunication->import()
/var/www/html/glpi/plugins/fusioninventory/front/communication.php:85 PluginFusioninventoryCommunication->handleOCSCommunication()
/var/www/html/glpi/plugins/fusioninventory/index.php:50 include_once()
Y a-t-il une correction déjà existante, ou je dois regarder dans le code pour modifier cette anomalie ?
Même pour les serveurs virtuels, il y a ses erreurs.
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
Version du plugin FusionInventory ?
Offline
C'est sur la version de Production mais j'ai oublié de le précisé pourtant je le sais
Donc GLPI 84.8 et FusionInventory 0.84+3.5
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
Oula, on ne fais plus de support sur cette vieille version, désolé, si t'as encore le soucis sur la version la plus récente je regarderai mais là non...
Offline
Ok et merci pour les réponses rapide.
En parlant de nouvelle version, la version 90+1.4 de fusion inventory, il y a une date de sortie prévue ?
Nous attendons cette version pour passé en GLPI 90.
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
Elle est sortie y a quelque jours, l'annonce est en préparation mais tu la trouveras sur github
Offline
Super et merci pour l'information. Je vais voir cela
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
J'ai cherché sur Github et je suis tombé sur le lien suivant :
https://github.com/fusioninventory/fusi … i/releases
On a téléchargé la version 0.90+1.4 mais impossible d'activer le plugin. Il marque "Your GLPI version not compatible, require >= 9.1"
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
Je viens de vérifié, il marque bien compatible 0.95.x et 0.90.x, tu essayes avec quelle version de GLPI?
Offline
J'essaye avec la version 0.90.5
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
Je ne sais pas ce qui s'est passé car dans le fichier setup on a "define ("PLUGIN_FUSIONINVENTORY_VERSION", "9.1+1.0");"
On a tout supprimer. Puis on a copié le répertoire téléchargé à la place de l'ancien est maintenant c'est bon.
Merci encore pour les informations .
Maintenant je vais le tester tout cela est je te tiendrai au courant par rapport à l'erreur du début de ce sujet.
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
oki
Offline
Alors premier test non concluant est le correctif indiqué sur ce lien https://github.com/fusioninventory/fusi … ssues/1821
J'ai verrouillé des champs (notamment le numéro de série) dans la configuration générale des ordinateurs et l'inventaire déconnecte les moniteurs automatiquement sans les rattacher.
Je peux ouvrir un autre sujet ci besoin vu que l'on est plus sur le bug de départ.
Si besoin, je peux re pencher dessus .
Last edited by kevinG (2016-08-12 16:00:19)
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
Bonjour,
Alors concernant le problème de départ et le précédent, les 2 sont liés. Cela vient du faite de verrouiller les champs pour l'ordinateur.
Je me suis penchés sur le code et j'ai apporté plusieurs modifications.
Normalement cela résout, les problèmes et cela arrête de remplir à gogo le fichier php-errors.log.
Sur la modification je n'ai pas encore fait de teste avec les imprimantes via une recherche snmp.
Pour le code, je le fournirai mardi matin avec une explication
PS : J'ai également mis une modification pour du code pour gérer les vmware. Celle-ci ce dupliquait à chaque inventaire mais mettre le numéro de série (normal le champ numéro de série est verrouillé). Encore un problème lier au verrou des champs sur l'ordinateur.
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
Si tu peux mettre les infos, genre les données pour reproduire et donc pour pouvoir ajouter des tests Merci d'avance
Offline
Comme convenu voici le code avec des explications.
Les modifications concernent les fonctions :
"replaceids" du fichier "formatconvert.class.php"
"checkLock" du fichier "toolbox.class.php"
Dans ce dernier fichier c'est uniquement pour les machines virtuels.
Dans la fonction "replaceids", j'ai ajouté la variable "$itemtype_recursif" dans les paramètres que j'initialise à vide, ainsi il n'y a pas lieu de vérifier chaque appelle de la fonction pour ajouter un paramètre.
function replaceids($array, $itemtype, $items_id,$itemtype_recursif='')
Lorsque l'on parcourt le array dans la boucle foreach :
Si l'on a une valeur de type array,
je vérifie si l'item en cours "$key" est égale à "$itemtype" et que "$key" est différent de "0".
(Un comportement que je ne comprends pas si $key = 0 alors il considère que $key = $itemtype donc j'ajoute cette dernière condition).
Si les deux conditions sont respectées alors je mémorise la variable "$itemtype" dans "$itemtype_recursif".
if (($key == $itemtype) && ($key != "0")){
$itemtype_recursif = $key;
}
Dans l'appel de cette fonction par récursivité, je passe en paramètre en plus la variable "$itemtype_recursif"
$array[$key] = $this->replaceids($value, $itemtype, $items_id, $itemtype_recursif);
Une fois que l'on revient dans la boucle où "$key=$itemtype" alors on vide la variable "$itemtype_recursif"
Ainsi les moniteurs, les disques durs, ... ne sera pas impacté par le verrou des champs dans la suite du code.
if(($itemtype_recursif == $itemtype) && ($itemtype_recursif == $key) && ($key != "0")){
$itemtype_recursif = '';
}
Sinon si c'est une valeur autre que array,
on vérifie si l'on est dans le cas d'une machine virtuel. Pour nous (ma société), le moyen facile de le voir et le numéro de série qui commence toujours par vmware.
On déclare une variable booléenne "$verification_serial_vmware" à "faux". Elle sera à "vrai" si on est dans une machine virtuel
Donc on fait un contrôle du champ qui ne doit pas être vide, puis s'il contient plus de 6 caractères.
Si l'on est sur "$key" = 'serial' et que la valeur commence par 'vmware', on met la variable "$verification_serial_vmware" à "vrai"
// On vérifie si on est dans une vmware avec le numéro de série qui commence par vmware
$verification_serial_vmware = false;
if (isset($array[$key]))
{
if (strlen($array[$key])>6)
{
if(($key == 'serial') && (strtoupper(substr($array[$key],0,6)) == 'VMWARE'))
{
$verification_serial_vmware = true;
}
}
}
Ensuite il ne reste plus qu'à faire le contrôle des champs verrouillés.
Si l'on est pas dans le cas d'une machine virtuel et si l'on est dans la boucle de "itemtype", on fait le contrôle de verrou sinon on initialise "$lockfield" à "faux"
if ((!$verification_serial_vmware) && ($itemtype_recursif == $itemtype)){
$lock_field = PluginFusioninventoryLock::isFieldLocked($a_lockable, $key);
}
else{
$lock_field = false;
}
Puis on laisse le traitement se dérouler normalement.
Et ce bout de code ne déconnecte pas les écrans s'ils sont rattachés manuellement.
Donc normalement il ne gêne pas le fonctionnement normal de l'outil.
J'utilise la variable "$itemtype" et on peut configurer le verrou sur les imprimantes et matériel réseau. Mais je n'ai pas pu tester ces deux derniers. Les imprimantes seront tester cette semaine.
Concernant la partie des machines virtuels, il y a une amélioration à apporter car je ne pense pas que toutes les machines virtuels des autres sociétés ont un numéro de série qui commence par vmware.
D'ailleurs en parlant de machine virtuel. Je me suis aperçu que l'on fait deux fois le ménage pour la partie "computer". Voici le code modifié pour la fonction "checkLock"
J'ajoute le même contrôle de machine virtuel que précédemment.
// On vérifie si on est dans une vmware avec le numéro de série qui commence par vmware
$verification_serial_vmware = false;
if ((isset($data[$field])) && ($field == 'serial'))
{
if (strlen($data[$field])>6)
{
if(strtoupper(substr($data[$field],0,6)) == 'VMWARE')
{
$verification_serial_vmware = true;
}
}
}
Ensuite on ajoute le contrôle pour voir si l'on est dans le cas d'une machine virtuel, on ne supprime pas la valeur.
if ((isset($data[$field])) && (!$verification_serial_vmware)) {
//if (isset($data[$field])) {
unset($data[$field]);
}
if ((isset($db_data[$field])) && (!$verification_serial_vmware)) {
//if (isset($db_data[$field])) {
unset($db_data[$field]);
}
Le code final pour la fonction "replaceids" :
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) {
// On vérifie si on est dans de l'item principal si c'est le cas on conserve la valeur pour la passer dans le prochain appel de la fonction
// On a une anomalie qui veut que si $key =0 alors $key = monitor, il faut donc exclure $key=0
if (($key == $itemtype) && ($key != "0")){
$itemtype_recursif = $key;
}
$array[$key] = $this->replaceids($value, $itemtype, $items_id, $itemtype_recursif);
if(($itemtype_recursif == $itemtype) && ($itemtype_recursif == $key) && ($key != "0")){
$itemtype_recursif = '';
}
} else {
// On vérifie si on est dans une vmware avec le numéro de série qui commence par vmware
$verification_serial_vmware = false;
if (isset($array[$key]))
{
if (strlen($array[$key])>6)
{
if(($key == 'serial') && (strtoupper(substr($array[$key],0,6)) == 'VMWARE'))
{
$verification_serial_vmware = true;
}
}
}
// si on est dans la boucle de l'item principal et que ce n'est pas une vmware alors on s'occupe des champs verrouillés sinon on dit que le champ n'est pas verrouillé
if ((!$verification_serial_vmware) && ($itemtype_recursif == $itemtype)){
$lock_field = PluginFusioninventoryLock::isFieldLocked($a_lockable, $key);
}
else{
$lock_field = false;
}
// Si le champ n'est pas verrouiller ou que l'on est dans les moniteur ou que l'on a une vmware on traite la valeur sinon on la supprime
if (!$lock_field) {
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") {
// On vérifie si manufacturers_id est verrouillé dans l'item principal. Si c'est le cas on utilise bios_manufacturers_id
if(!PluginFusioninventoryLock::isFieldLocked($a_lockable, 'manufacturers_id')){
$array[$key] = Dropdown::importExternal($this->foreignkey_itemtype['manufacturers_id'],
$value);
}
else{
$array[$key] = Dropdown::importExternal($this->foreignkey_itemtype[$key],
$value);
}
//fin du contrôle ajouter
} 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;
}
Le code final pour la fonction "checkLock" :
static function checkLock($data, $db_data, $a_lockable=array()) {
foreach($a_lockable as $field) {
// On vérifie si on est dans une vmware avec le numéro de série qui commence par vmware
$verification_serial_vmware = false;
if ((isset($data[$field])) && ($field == 'serial'))
{
if (strlen($data[$field])>6)
{
if(strtoupper(substr($data[$field],0,6)) == 'VMWARE')
{
$verification_serial_vmware = true;
}
}
}
if ((isset($data[$field])) && (!$verification_serial_vmware)) {
//if (isset($data[$field])) {
unset($data[$field]);
}
if ((isset($db_data[$field])) && (!$verification_serial_vmware)) {
//if (isset($db_data[$field])) {
unset($db_data[$field]);
}
}
return array($data, $db_data);
}
Si ce n'est pas clair je peux apporter des précisions ou m'exprimer mieux.
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
Pour faire des tests, il faut aller dans "Plugins > FusionInventory" puis dans le menu "Général" puis choisir "configuration générale" et dans l'onglet "Verrous (champ)", verrouiller au moins les champs pour les ordinateurs:
numéro de série
fabricant
Reste à faire des tests sur les imprimantes et sur le matériel réseau.
PS (Modification à 12:52) :
Lors d'un inventaire, si aucune règle n'est validé, est ce normal que la remontée d'inventaire s'effectue ?
Last edited by kevinG (2016-08-16 12:56:19)
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
J'ai rajouté dans l'issue, je vais pouvoir regarder ça, peut être pas cette semaine, je suis en vacance et donc avec une connexion très basse, mais d'ici fin du mois oui
Offline
Ok, bonne vacances
Si tu as des questions par rapport à mes messages, je serai disponible jusque début septembre.
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
oki
Offline
J'ai fait des testes avec les imprimantes et 1 onduleur, avec un inventaire réseau (snmp), et le matériel est bien mis à jour et les verrous mis dans la configuration générale sont bien respectés.
Par contre je pose une question sur le fonctionnement.
Je ne sais pas comment l'expliquer donc je vais donner un exemple :
On change l'UC A d'un poste par une UC B car A est HS et on garde le même écran.
Pour x raison(s), le poste avec l'UC A reste en production dans GLPI avec son écran attaché.
Dans le même temps le poste avec l'UC B remontent dans GLPI, mais il ne rattache pas son écran car l'écran est encore attaché à l'UC A.
J'espère mettre bien exprimé .
Pour information, avant la question, cela se produit avec ou sans ma modification de code.
Est-ce un comportement voulu ou une anomalie ou une option que j'aurais loupé ?
Dans la version 0.84+3.5 l'écran s'attachait sur le dernier poste où il était connecté et pour qu'il reste sur un poste il fallait l'attacher manuellement (chose qui fonctionne toujours pour le rattachement manuelle)
Last edited by kevinG (2016-08-18 13:29:58)
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
Tu veux dire que l'écran ne change pas de PC? Si c'est le cas c'est un bug
Offline
Oui c'est ca, il déconnecte bien l'ancien mais si le nouveau est connecté à un autre pc, l'écran ne change pas de PC.
Je vais regarder et je te tiendrai au courant ;-)
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
Tu peux faire une issue pour tracer & corriger ?
Offline
Ok je vais voir cela, mais j'ai encore un peu de mal avec github pour naviguer sur le site
Edit : Voila j'ai créé :
https://github.com/fusioninventory/fusi … ssues/1908
Mon pseudo sur le site github c'est demonisto
Last edited by kevinG (2016-08-19 16:17:56)
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