/** * Change software's name, and move versions if needed * * @param $ID old software ID * @param $new_software_id new software ID * @param $version_id version ID to move * @param $old_version old version name * @param $new_version new version name * @param $entity entity ID */ function moveVersions($ID, $new_software_id, $version_id, $old_version, $new_version, $entity) { global $DB; $new_versionID = $this->versionExists($new_software_id, $version_id, $new_version); // Do something if it is not the same version if ($new_versionID != $version_id) { //A version does not exist : update existing one if ($new_versionID == -1) { //Transfer versions from old software to new software for a specific version $DB->query("UPDATE `glpi_softwareversions`\n SET `name` = '{$new_version}',\n `softwares_id` = '{$new_software_id}'\n WHERE `id` = '{$version_id}'"); } else { //Change ID of the version in glpi_computers_softwareversions $DB->query("UPDATE `glpi_computers_softwareversions`\n SET `softwareversions_id` = '{$new_versionID}'\n WHERE `softwareversions_id` = '{$version_id}'"); // Update licenses version link $DB->query("UPDATE `glpi_softwarelicenses`\n SET `softwareversions_id_buy` = '{$new_versionID}'\n WHERE `softwareversions_id_buy` = '{$version_id}'"); $DB->query("UPDATE `glpi_softwarelicenses`\n SET `softwareversions_id_use` = '{$new_versionID}'\n WHERE `softwareversions_id_use` = '{$version_id}'"); //Delete old version $old_version = new SoftwareVersion(); $old_version->delete(array("id" => $version_id)); } } }
function cleanSoftwareVersions() { if (!isset($this->already_transfer['SoftwareVersion'])) { return; } $vers = new SoftwareVersion(); foreach ($this->already_transfer['SoftwareVersion'] as $old => $new) { if (countElementsInTable("glpi_softwarelicenses", "softwareversions_id_buy={$old}") == 0 && countElementsInTable("glpi_softwarelicenses", "softwareversions_id_use={$old}") == 0 && countElementsInTable("glpi_computers_softwareversions", "softwareversions_id={$old}") == 0) { $vers->delete(array('id' => $old)); } } }
} if (!isset($_GET["softwares_id"])) { $_GET["softwares_id"] = ""; } $version = new SoftwareVersion(); if (isset($_POST["add"])) { $version->check(-1, 'w', $_POST); if ($newID = $version->add($_POST)) { Event::log($_POST['softwares_id'], "software", 4, "inventory", $_SESSION["glpiname"] . " " . $LANG['log'][82] . " {$newID}."); glpi_header($CFG_GLPI["root_doc"] . "/front/software.form.php?id=" . $version->fields['softwares_id']); } glpi_header($_SERVER['HTTP_REFERER']); } else { if (isset($_POST["delete"])) { $version->check($_POST['id'], 'w'); $version->delete($_POST); Event::log($version->fields['softwares_id'], "software", 4, "inventory", $_SESSION["glpiname"] . " " . $LANG['log'][84] . " " . $_POST["id"]); $version->redirectToList(); } else { if (isset($_POST["update"])) { $version->check($_POST['id'], 'w'); $version->update($_POST); Event::log($version->fields['softwares_id'], "software", 4, "inventory", $_SESSION["glpiname"] . " " . $LANG['log'][83] . " " . $_POST["id"]); glpi_header($_SERVER['HTTP_REFERER']); } else { commonHeader($LANG['Menu'][4], $_SERVER['PHP_SELF'], "inventory", "software"); $version->showForm($_GET["id"], array('softwares_id' => $_GET["softwares_id"])); commonFooter(); } } }
/** * Update config of a new software * * This function create a new software in GLPI with some general data. * * @param $computers_id integer : glpi computer id. * @param $entity integer : entity of the computer * @param $ocsid integer : ocs computer id (ID). * @param $plugin_ocsinventoryng_ocsservers_id integer : ocs server id * @param $cfg_ocs array : ocs config * @param $import_software array : already imported softwares * @param $dohistory boolean : log changes? * * @return Nothing (void). **/ static function updateSoftware($computers_id, $entity, $ocsid, $plugin_ocsinventoryng_ocsservers_id, array $cfg_ocs, $dohistory) { global $DB, $PluginOcsinventoryngDBocs; $alread_processed = array(); $is_utf8 = $cfg_ocs["ocs_db_utf8"]; $computer_softwareversion = new Computer_SoftwareVersion(); self::checkOCSconnection($plugin_ocsinventoryng_ocsservers_id); if ($cfg_ocs["import_software"]) { //---- Get all the softwares for this machine from OCS -----// if ($cfg_ocs["use_soft_dict"]) { $query2 = "SELECT `dico_soft`.`FORMATTED` AS NAME,\n `softwares`.`VERSION` AS VERSION,\n `softwares`.`PUBLISHER` AS PUBLISHER,\n `softwares`.`COMMENTS` AS COMMENTS\n FROM `softwares`\n INNER JOIN `dico_soft` ON (`softwares`.`NAME` = dico_soft.EXTRACTED)\n WHERE `softwares`.`HARDWARE_ID` = '{$ocsid}'"; } else { $query2 = "SELECT `softwares`.`NAME` AS NAME,\n `softwares`.`VERSION` AS VERSION,\n `softwares`.`PUBLISHER` AS PUBLISHER,\n `softwares`.`COMMENTS` AS COMMENTS\n FROM `softwares`\n WHERE `softwares`.`HARDWARE_ID` = '{$ocsid}'"; } $result2 = $PluginOcsinventoryngDBocs->query($query2); $soft = new Software(); // Read imported software in last sync $query = "SELECT `glpi_computers_softwareversions`.`id` as id,\n `glpi_softwares`.`name` as sname,\n `glpi_softwareversions`.`name` as vname\n FROM `glpi_computers_softwareversions`\n INNER JOIN `glpi_softwareversions`\n ON `glpi_softwareversions`.`id`= `glpi_computers_softwareversions`.`softwareversions_id`\n INNER JOIN `glpi_softwares`\n ON `glpi_softwares`.`id`= `glpi_softwareversions`.`softwares_id`\n WHERE `glpi_computers_softwareversions`.`computers_id`='{$computers_id}'\n AND `is_dynamic`"; $imported = array(); foreach ($DB->request($query) as $data) { $imported[$data['id']] = strtolower($data['sname'] . self::FIELD_SEPARATOR . $data['vname']); } if ($PluginOcsinventoryngDBocs->numrows($result2) > 0) { while ($data2 = $PluginOcsinventoryngDBocs->fetch_array($result2)) { $data2 = Toolbox::clean_cross_side_scripting_deep(Toolbox::addslashes_deep($data2)); //As we cannot be sure that data coming from OCS are in utf8, let's try to encode them //if possible foreach (array('NAME', 'PUBLISHER', 'VERSION') as $field) { $data2[$field] = self::encodeOcsDataInUtf8($is_utf8, $data2[$field]); } //Replay dictionnary on manufacturer $manufacturer = Manufacturer::processName($data2["PUBLISHER"]); $version = $data2['VERSION']; $name = $data2['NAME']; //Software might be created in another entity, depending on the entity's configuration $target_entity = Entity::getUsedConfig('entities_id_software', $entity, '', true); //Do not change software's entity except if the dictionnary explicity changes it if ($target_entity < 0) { $target_entity = $entity; } $modified_name = $name; $modified_version = $version; $is_helpdesk_visible = NULL; if (!$cfg_ocs["use_soft_dict"]) { //Software dictionnary $params = array("name" => $name, "manufacturer" => $manufacturer, "old_version" => $version, "entities_id" => $entity); $rulecollection = new RuleDictionnarySoftwareCollection(); $res_rule = $rulecollection->processAllRules(Toolbox::stripslashes_deep($params), array(), Toolbox::stripslashes_deep(array('version' => $version))); if (isset($res_rule["name"]) && $res_rule["name"]) { $modified_name = $res_rule["name"]; } if (isset($res_rule["version"]) && $res_rule["version"]) { $modified_version = $res_rule["version"]; } if (isset($res_rule["is_helpdesk_visible"]) && strlen($res_rule["is_helpdesk_visible"])) { $is_helpdesk_visible = $res_rule["is_helpdesk_visible"]; } if (isset($res_rule['manufacturer']) && $res_rule['manufacturer']) { $manufacturer = Dropdown::getDropdownName('glpi_manufacturers', $res_rule['manufacturer']); $manufacturer = Toolbox::addslashes_deep($manufacturer); } //If software dictionnary returns an entity, it overrides the one that may have //been defined in the entity's configuration if (isset($res_rule["new_entities_id"]) && strlen($res_rule["new_entities_id"])) { $target_entity = $res_rule["new_entities_id"]; } } //If software must be imported if (!isset($res_rule["_ignore_import"]) || !$res_rule["_ignore_import"]) { // Clean software object $soft->reset(); // EXPLANATION About dictionnaries // OCS dictionnary : if software name change, as we don't store INITNAME // GLPI will detect an uninstall (oldname) + install (newname) // GLPI dictionnary : is rule have change // if rule have been replayed, modifiedname will be found => ok // if not, GLPI will detect an uninstall (oldname) + install (newname) $id = array_search(strtolower(stripslashes($modified_name . self::FIELD_SEPARATOR . $version)), $imported); if ($id) { //-------------------------------------------------------------------------// //---- The software exists in this version for this computer --------------// //---------------------------------------------------- --------------------// unset($imported[$id]); } else { //------------------------------------------------------------------------// //---- The software doesn't exists in this version for this computer -----// //------------------------------------------------------------------------// $isNewSoft = $soft->addOrRestoreFromTrash($modified_name, $manufacturer, $target_entity, '', $entity != $target_entity, $is_helpdesk_visible); //Import version for this software $versionID = self::importVersion($isNewSoft, $modified_version); //Install license for this machine $instID = self::installSoftwareVersion($computers_id, $versionID, $dohistory); } } } } foreach ($imported as $id => $unused) { $computer_softwareversion->delete(array('id' => $id, '_no_history' => !$dohistory), true); // delete cause a getFromDB, so fields contains values $verid = $computer_softwareversion->getField('softwareversions_id'); if (countElementsInTable('glpi_computers_softwareversions', "softwareversions_id = '{$verid}'") == 0 && countElementsInTable('glpi_softwarelicenses', "softwareversions_id_buy = '{$verid}'") == 0) { $vers = new SoftwareVersion(); if ($vers->getFromDB($verid) && countElementsInTable('glpi_softwarelicenses', "softwares_id = '" . $vers->fields['softwares_id'] . "'") == 0 && countElementsInTable('glpi_softwareversions', "softwares_id = '" . $vers->fields['softwares_id'] . "'") == 1) { // 1 is the current to be removed $soft->putInTrash($vers->fields['softwares_id'], __('Software deleted by OCSNG synchronization')); } $vers->delete(array("id" => $verid)); } } } }
} if (!isset($_GET["softwares_id"])) { $_GET["softwares_id"] = ""; } $version = new SoftwareVersion(); if (isset($_POST["add"])) { $version->check(-1, CREATE, $_POST); if ($newID = $version->add($_POST)) { Event::log($_POST['softwares_id'], "software", 4, "inventory", sprintf(__('%1$s adds the version %2$s'), $_SESSION["glpiname"], $newID)); Html::redirect($CFG_GLPI["root_doc"] . "/front/software.form.php?id=" . $version->fields['softwares_id']); } Html::back(); } else { if (isset($_POST["purge"])) { $version->check($_POST['id'], PURGE); $version->delete($_POST, 1); Event::log($version->fields['softwares_id'], "software", 4, "inventory", sprintf(__('%1$s purges the version %2$s'), $_SESSION["glpiname"], $_POST["id"])); $version->redirectToList(); } else { if (isset($_POST["update"])) { $version->check($_POST['id'], UPDATE); $version->update($_POST); Event::log($version->fields['softwares_id'], "software", 4, "inventory", sprintf(__('%1$s updates the version %2$s'), $_SESSION["glpiname"], $_POST["id"])); Html::back(); } else { Html::header(SoftwareVersion::getTypeName(Session::getPluralNumber()), $_SERVER['PHP_SELF'], "assets", "software"); $version->display(array('id' => $_GET["id"], 'softwares_id' => $_GET["softwares_id"])); Html::footer(); } } }
/** * Change software's name, and move versions if needed * * @param $ID old software ID * @param $new_software_id new software ID * @param $version_id version ID to move * @param $old_version old version name * @param $new_version new version name * @param $entity entity ID */ function moveVersions($ID, $new_software_id, $version_id, $old_version, $new_version, $entity) { global $DB; $new_versionID = $this->versionExists($new_software_id, $version_id, $new_version); // Do something if it is not the same version if ($new_versionID != $version_id) { //A version does not exist : update existing one if ($new_versionID == -1) { //Transfer versions from old software to new software for a specific version $DB->query("UPDATE `glpi_softwareversions`\n SET `name` = '{$new_version}',\n `softwares_id` = '{$new_software_id}'\n WHERE `id` = '{$version_id}'"); } else { // Delete software can be in double after update $sql = "SELECT gcs_2.*\n FROM `glpi_computers_softwareversions`\n LEFT JOIN `glpi_computers_softwareversions` AS gcs_2\n ON `glpi_computers_softwareversions`.`computers_id` = gcs_2.`computers_id`\n WHERE `glpi_computers_softwareversions`.`softwareversions_id` = '{$new_versionID}'\n AND gcs_2.`softwareversions_id` = '{$version_id}'"; $res = $DB->query($sql); if ($DB->numrows($res) > 0) { while ($result = $DB->fetch_assoc($res)) { $DB->query("DELETE FROM `glpi_computers_softwareversions`\n WHERE `id` = '" . $result['id'] . "'"); } } //Change ID of the version in glpi_computers_softwareversions $DB->query("UPDATE `glpi_computers_softwareversions`\n SET `softwareversions_id` = '{$new_versionID}'\n WHERE `softwareversions_id` = '{$version_id}'"); // Update licenses version link $DB->query("UPDATE `glpi_softwarelicenses`\n SET `softwareversions_id_buy` = '{$new_versionID}'\n WHERE `softwareversions_id_buy` = '{$version_id}'"); $DB->query("UPDATE `glpi_softwarelicenses`\n SET `softwareversions_id_use` = '{$new_versionID}'\n WHERE `softwareversions_id_use` = '{$version_id}'"); //Delete old version $old_version = new SoftwareVersion(); $old_version->delete(array("id" => $version_id)); } } }
/** * Update config of a new software * * This function create a new software in GLPI with some general datas. * * @param $computers_id integer : glpi computer id. * @param $entity integer : entity of the computer * @param $ocsid integer : ocs computer id (ID). * @param $ocsservers_id integer : ocs server id * @param $cfg_ocs array : ocs config * @param $import_software array : already imported softwares * @param $dohistory boolean : log changes ? * * @return Nothing (void). **/ static function updateSoftware($computers_id, $entity, $ocsid, $ocsservers_id, $cfg_ocs, $import_software, $dohistory) { global $DB, $DBocs, $LANG; self::checkOCSconnection($ocsservers_id); if ($cfg_ocs["import_software"]) { //------------------------------------------------------------------------------// //---- Import_software array is not in the new form ( ID => name+version) ------// //------------------------------------------------------------------------------// if (!in_array(self::IMPORT_TAG_070, $import_software)) { //Add the tag of the version at the beginning of the array $softs_array[0] = self::IMPORT_TAG_070; //For each element of the table, add instID=>name.version foreach ($import_software as $key => $value) { $query_softs = "SELECT `glpi_softwareversions`.`name` AS version\n FROM `glpi_computers_softwareversions`,\n `glpi_softwareversions`\n WHERE `glpi_computers_softwareversions`.`softwareversions_id`\n =`glpi_softwareversions`.`id`\n AND `glpi_computers_softwareversions`.`computers_id`\n = '{$computers_id}'\n AND `glpi_computers_softwareversions`.`id` = '{$key}'"; $result_softs = $DB->query($query_softs); $softs = $DB->fetch_array($result_softs); $softs_array[$key] = $value . self::FIELD_SEPARATOR . $softs["version"]; } //Replace in GLPI database the import_software by the new one self::replaceOcsArray($computers_id, $softs_array, "import_software"); // Get import_software from the GLPI db $query = "SELECT `import_software`\n FROM `glpi_ocslinks`\n WHERE `computers_id` = '{$computers_id}'"; $result = $DB->query($query); //Reload import_software from DB if ($DB->numrows($result)) { $tmp = $DB->fetch_array($result); $import_software = importArrayFromDB($tmp["import_software"]); } } //---- Get all the softwares for this machine from OCS -----// if ($cfg_ocs["use_soft_dict"]) { $query2 = "SELECT `softwares`.`NAME` AS INITNAME,\n `dico_soft`.`FORMATTED` AS NAME,\n `softwares`.`VERSION` AS VERSION,\n `softwares`.`PUBLISHER` AS PUBLISHER,\n `softwares`.`COMMENTS` AS COMMENTS\n FROM `softwares`\n INNER JOIN `dico_soft` ON (`softwares`.`NAME` = dico_soft.EXTRACTED)\n WHERE `softwares`.`HARDWARE_ID` = '{$ocsid}'"; } else { $query2 = "SELECT `softwares`.`NAME` AS INITNAME,\n `softwares`.`NAME` AS NAME,\n `softwares`.`VERSION` AS VERSION,\n `softwares`.`PUBLISHER` AS PUBLISHER,\n `softwares`.`COMMENTS` AS COMMENTS\n FROM `softwares`\n WHERE `softwares`.`HARDWARE_ID` = '{$ocsid}'"; } $result2 = $DBocs->query($query2); $to_add_to_ocs_array = array(); $soft = new Software(); if ($DBocs->numrows($result2) > 0) { while ($data2 = $DBocs->fetch_array($result2)) { $data2 = clean_cross_side_scripting_deep(addslashes_deep($data2)); $initname = $data2["INITNAME"]; // Hack for OCS encoding problems if (!$cfg_ocs["ocs_db_utf8"] && !seems_utf8($initname)) { $initname = encodeInUtf8($initname); } $name = $data2["NAME"]; // Hack for OCS encoding problems if (!$cfg_ocs["ocs_db_utf8"] && !seems_utf8($name)) { $name = encodeInUtf8($name); } // Hack for OCS encoding problems if (!$cfg_ocs["ocs_db_utf8"] && !seems_utf8($data2["PUBLISHER"])) { $data2["PUBLISHER"] = encodeInUtf8($data2["PUBLISHER"]); } $version = $data2["VERSION"]; $manufacturer = Manufacturer::processName($data2["PUBLISHER"]); $use_glpi_dictionnary = false; if (!$cfg_ocs["use_soft_dict"]) { //Software dictionnary $rulecollection = new RuleDictionnarySoftwareCollection(); $res_rule = $rulecollection->processAllRules(array("name" => $name, "manufacturer" => $manufacturer, "old_version" => $version), array(), array('version' => $version)); $res_rule = addslashes_deep($res_rule); if (isset($res_rule["name"])) { $modified_name = $res_rule["name"]; } else { $modified_name = $name; } if (isset($res_rule["version"]) && $res_rule["version"] != '') { $modified_version = $res_rule["version"]; } else { $modified_version = $version; } } else { $modified_name = $name; $modified_version = $version; } //Ignore this software if (!isset($res_rule["_ignore_ocs_import"]) || !$res_rule["_ignore_ocs_import"]) { // Clean software object $soft->reset(); //If name+version not in present for this computer in glpi, add it if (!in_array(stripslashes($initname . self::FIELD_SEPARATOR . $version), $import_software)) { //------------------------------------------------------------------------// //---- The software doesn't exists in this version for this computer -----// //------------------------------------------------------------------------// $isNewSoft = $soft->addOrRestoreFromTrash($modified_name, $manufacturer, $entity); //Import version for this software $versionID = self::importVersion($isNewSoft, $modified_version); //Install license for this machine $instID = self::installSoftwareVersion($computers_id, $versionID, $dohistory); //Add the software to the table of softwares for this computer to add in database $to_add_to_ocs_array[$instID] = $initname . self::FIELD_SEPARATOR . $version; } else { $instID = -1; //-------------------------------------------------------------------------// //---- The software exists in this version for this computer --------------// //---------------------------------------------------- --------------------// //Get the name of the software in GLPI to know if the software's name //have already been changed by the OCS dictionnary $instID = array_search(stripslashes($initname . self::FIELD_SEPARATOR . $version), $import_software); $query_soft = "SELECT `glpi_softwares`.`id`,\n `glpi_softwares`.`name`,\n `glpi_softwares`.`entities_id`\n FROM `glpi_softwares`,\n `glpi_computers_softwareversions`,\n `glpi_softwareversions`\n WHERE `glpi_computers_softwareversions`.`id` = '{$instID}'\n AND `glpi_computers_softwareversions`.`softwareversions_id`\n = `glpi_softwareversions`.`id`\n AND `glpi_softwareversions`.`softwares_id`\n = `glpi_softwares`.`id`"; $result_soft = $DB->query($query_soft); $tmpsoft = $DB->fetch_array($result_soft); $softName = $tmpsoft["name"]; $softID = $tmpsoft["id"]; $s = new Software(); $input["id"] = $softID; $input["entities_id"] = $tmpsoft['entities_id']; //First, get the name of the software into GLPI db IF dictionnary is used if ($cfg_ocs["use_soft_dict"]) { //First use of the OCS dictionnary OR name changed in the dictionnary if ($softName != $name) { $input["name"] = $name; $s->update($input); } } else { if ($softName != $modified_name) { // OCS Dictionnary not use anymore : revert to original name $input["name"] = $modified_name; $s->update($input); } } unset($import_software[$instID]); } } } } //Remove the tag from the import_software array unset($import_software[0]); //Add all the new softwares if (count($to_add_to_ocs_array)) { self::addToOcsArray($computers_id, $to_add_to_ocs_array, "import_software"); } // Remove softwares not present in OCS if (count($import_software)) { $inst = new Computer_SoftwareVersion(); foreach ($import_software as $key => $val) { $query = "SELECT *\n FROM `glpi_computers_softwareversions`\n WHERE `id` = '{$key}'"; $result = $DB->query($query); if ($DB->numrows($result) > 0) { if ($data = $DB->fetch_assoc($result)) { $inst->delete(array('id' => $key, '_no_history' => !$dohistory)); if (countElementsInTable('glpi_computers_softwareversions', "softwareversions_id = '" . $data['softwareversions_id'] . "'") == 0 && countElementsInTable('glpi_softwarelicenses', "softwareversions_id_buy = '" . $data['softwareversions_id'] . "'") == 0) { $vers = new SoftwareVersion(); if ($vers->getFromDB($data['softwareversions_id']) && countElementsInTable('glpi_softwarelicenses', "softwares_id = '" . $vers->fields['softwares_id'] . "'") == 0 && countElementsInTable('glpi_softwareversions', "softwares_id = '" . $vers->fields['softwares_id'] . "'") == 1) { // 1 is the current to be removed $soft->putInTrash($vers->fields['softwares_id'], $LANG['ocsng'][54]); } $vers->delete(array("id" => $data['softwareversions_id'])); } } } self::deleteInOcsArray($computers_id, $key, "import_software"); } } } }