%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/install/ |
| Current File : //var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/install/update.native.php |
<?php
/**
* ---------------------------------------------------------------------
* GLPI Inventory Plugin
* Copyright (C) 2021 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on FusionInventory for GLPI
* Copyright (C) 2010-2021 by the FusionInventory Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI Inventory Plugin.
*
* GLPI Inventory Plugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GLPI Inventory Plugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with GLPI Inventory Plugin. If not, see <https://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
/**
* The main function to update the plugin
*
* @global object $DB
* @param string $current_version
* @param string $migrationname
*/
function pluginGlpiinventoryUpdateNative($current_version, $migrationname = 'Migration')
{
global $DB;
$DB->disableTableCaching();
ini_set("max_execution_time", "0");
ini_set("memory_limit", "-1");
/** @var Migration */
$migration = new $migrationname($current_version);
$migration->displayMessage("Migration Classname : " . $migrationname);
$migration->displayMessage("Use core capabilities");
//mappings
$agents_mapping = [];
$unmanageds_mapping = [];
$migration->displayMessage("Use core agent");
if ($DB->tableExists('glpi_plugin_glpiinventory_agents')) {
$agents_tables = [
'glpi_plugin_glpiinventory_ignoredimportdevices',
'glpi_plugin_glpiinventory_rulematchedlogs',
'glpi_plugin_glpiinventory_statediscoveries',
'glpi_plugin_glpiinventory_taskjobstates',
'glpi_plugin_glpiinventory_unmanageds',
];
$iterator = $DB->request([
'FROM' => 'glpi_plugin_glpiinventory_agents'
]);
$agent = new Agent();
$agenttype = new AgentType();
if (!$agenttype->getFromDBByCrit(['name' => 'GLPI Inventory Plugin'])) {
$agenttype->add(['name' => 'GLPI Inventory Plugin']);
}
foreach ($iterator as $data_agent) {
$old_id = $data_agent['id'];
//mappings
$data_agent['deviceid'] = $data_agent['device_id'];
$data_agent['itemtype'] = 'Computer';
$data_agent['items_id'] = $data_agent['computers_id'];
$data_agent['port'] = $data_agent['agent_port'];
$data_agent['agenttypes_id'] = $agenttype->fields['id'];
unset(
$data_agent['id'],
$data_agent['device_id'],
$data_agent['computers_id'],
$data_agent['senddico'],
$data_agent['agent_port']
);
$new_id = $agent->add(Toolbox::addslashes_deep($data_agent));
$agents_mapping[$old_id] = $new_id;
}
//update to new ids
if (count($agents_mapping)) {
foreach ($agents_tables as $agent_table) {
if (!$DB->tableExists($agent_table)) {
continue;
}
foreach ($agents_mapping as $old_agent_id => $new_agent_id) {
if ($old_agent_id == $new_agent_id) {
continue;
}
$DB->doQueryOrDie(
$DB->buildUpdate(
$agent_table,
[
'agents_id' => $new_agent_id
],
[
'agents_id' => $old_agent_id
]
)
);
}
}
}
$migration->dropTable('glpi_plugin_glpiinventory_agents');
}
if ($DB->tableExists('glpi_plugin_glpiinventory_agentmodules')) {
$agentmodules_iterator = $DB->request(['FROM' => 'glpi_plugin_glpiinventory_agentmodules']);
foreach ($agentmodules_iterator as $agentmodule) {
$old_agent_ids = importArrayFromDB($agentmodule['exceptions']);
$new_agent_ids = [];
foreach ($old_agent_ids as $old_agent_id) {
if (!array_key_exists($old_agent_id, $agents_mapping)) {
continue; // Agent does not exist anymore, data is probably stale
}
$new_agent_ids[] = $agents_mapping[$old_agent_id];
}
$DB->doQueryOrDie(
$DB->buildUpdate(
'glpi_plugin_glpiinventory_agentmodules',
[
'exceptions' => exportArrayToDB($new_agent_ids)
],
[
'id' => $agentmodule['id']
]
)
);
}
}
$migration->displayMessage("Use core SNMP credentials");
if ($DB->tableExists('glpi_plugin_glpiinventory_configsecurities')) {
$cs_mapping = [];
$cs_tables = [
'glpi_plugin_glpiinventory_unmanageds',
'glpi_plugin_glpiinventory_ipranges_configsecurities',
'glpi_plugin_glpiinventory_networkequipments',
'glpi_plugin_glpiinventory_printers'
];
$iterator = $DB->request([
'FROM' => 'glpi_plugin_glpiinventory_configsecurities'
]);
$snmpcred = new SNMPCredential();
foreach ($iterator as $cs) {
$old_id = $cs['id'];
unset($cs['id']);
//crypt passwords
if (!empty($cs['auth_passphrase'])) {
$cs['auth_passphrase'] = (new GLPIKey())->encrypt($cs['auth_passphrase']);
}
if (!empty($cs['priv_passphrase'])) {
$cs['priv_passphrase'] = (new GLPIKey())->encrypt($cs['priv_passphrase']);
}
$search_crit = [
'name' => $cs['name'],
'snmpversion' => $cs['snmpversion'],
'community' => $cs['community'],
'username' => !empty($cs['username']) ? $cs['username'] : null,
'authentication' => !empty($cs['authentication']) && $cs['authentication'] != '0' ? $cs['authentication'] : null,
'auth_passphrase' => !empty($cs['auth_passphrase']) ? $cs['auth_passphrase'] : null,
'encryption' => !empty($cs['encryption']) && $cs['encryption'] != '0' ? $cs['encryption'] : null,
'priv_passphrase' => !empty($cs['priv_passphrase']) ? $cs['priv_passphrase'] : null,
'is_deleted' => $cs['is_deleted'],
];
if ($snmpcred->getFromDBByCrit($search_crit)) {
$new_id = $snmpcred->fields['id'];
} else {
$new_id = $snmpcred->add($cs);
}
if ($new_id != $old_id) {
$cs_mapping[$old_id] = $new_id;
}
}
//update to new ids
if (count($cs_mapping)) {
foreach ($cs_tables as $cs_table) {
if (!$DB->tableExists($cs_table)) {
continue;
}
foreach ($cs_mapping as $old_cs_id => $new_cs_id) {
$DB->doQueryOrDie(
$DB->buildUpdate(
$cs_table,
[
'plugin_glpiinventory_configsecurities_id' => $new_cs_id
],
[
'plugin_glpiinventory_configsecurities_id' => $old_cs_id
]
)
);
}
}
}
$migration->dropTable('glpi_plugin_glpiinventory_configsecurities');
}
if (
$DB->tableExists('glpi_plugin_glpiinventory_ipranges_configsecurities')
&& !$DB->tableExists('glpi_plugin_glpiinventory_ipranges_snmpcredentials')
) {
// snmp credentials must be migrated before that one
$migration->renameTable(
'glpi_plugin_glpiinventory_ipranges_configsecurities',
'glpi_plugin_glpiinventory_ipranges_snmpcredentials'
);
$migration->changeField(
'glpi_plugin_glpiinventory_ipranges_snmpcredentials',
'plugin_glpiinventory_configsecurities_id',
'snmpcredentials_id',
'int unsigned NOT NULL DEFAULT 0'
);
$migration->dropKey('glpi_plugin_glpiinventory_ipranges_snmpcredentials', 'unicity');
$migration->addKey('glpi_plugin_glpiinventory_ipranges_snmpcredentials', ['plugin_glpiinventory_ipranges_id', 'snmpcredentials_id'], 'unicity');
} elseif ($DB->tableExists('glpi_plugin_glpiinventory_ipranges_configsecurities')) {
$migration->dropTable('glpi_plugin_glpiinventory_ipranges_configsecurities');
}
$migration->displayMessage("Use core network ports");
if ($DB->tableExists('glpi_plugin_glpiinventory_networkports')) {
$DB->doQueryOrDie(
"UPDATE `glpi_networkports` AS `ports`
INNER JOIN (
SELECT
`networkports_id`,
`ifmtu`,
`ifspeed`,
`ifinternalstatus`,
`ifconnectionstatus`,
`iflastchange`,
`ifinoctets`,
`ifinerrors`,
`ifoutoctets`,
`ifouterrors`,
`ifstatus`,
`mac`,
`ifdescr`,
`ifalias`,
`portduplex`,
`trunk`,
`lastup`
FROM `glpi_plugin_glpiinventory_networkports`
) AS `plugin_ports` ON `plugin_ports`.`networkports_id` = `ports`.`id`
SET
`ports`.`ifmtu` = `plugin_ports`.`ifmtu`,
`ports`.`ifspeed` = `plugin_ports`.`ifspeed`,
`ports`.`ifinternalstatus` = `plugin_ports`.`ifinternalstatus`,
`ports`.`ifconnectionstatus` = `plugin_ports`.`ifconnectionstatus`,
`ports`.`iflastchange` = `plugin_ports`.`iflastchange`,
`ports`.`ifinbytes` = `plugin_ports`.`ifinoctets`,
`ports`.`ifinerrors` = `plugin_ports`.`ifinerrors`,
`ports`.`ifoutbytes` = `plugin_ports`.`ifoutoctets`,
`ports`.`ifouterrors` = `plugin_ports`.`ifouterrors`,
`ports`.`ifstatus` = `plugin_ports`.`ifstatus`,
`ports`.`mac` = `plugin_ports`.`mac`,
`ports`.`ifdescr` = `plugin_ports`.`ifdescr`,
`ports`.`ifalias` = `plugin_ports`.`ifalias`,
`ports`.`portduplex` = `plugin_ports`.`portduplex`,
`ports`.`trunk` = `plugin_ports`.`trunk`,
`ports`.`lastup` = `plugin_ports`.`lastup`
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_networkports');
}
$migration->displayMessage("Use core computers");
if ($DB->tableExists('glpi_plugin_glpiinventory_inventorycomputercomputers')) {
$DB->doQueryOrDie(
"UPDATE `glpi_computers` AS `computers`
INNER JOIN (
SELECT
`computers_id`,
`last_inventory_update`
FROM `glpi_plugin_glpiinventory_inventorycomputercomputers`
) AS `plugin_computers` ON `plugin_computers`.`computers_id` = `computers`.`id`
SET
`computers`.`last_inventory_update` = `plugin_computers`.`last_inventory_update`
WHERE `computers`.`last_inventory_update` IS NULL;"
);
$DB->doQueryOrDie(
"UPDATE `glpi_computers` AS `computers`
INNER JOIN (
SELECT
`computers_id`,
`last_boot`
FROM `glpi_plugin_glpiinventory_inventorycomputercomputers`
) AS `plugin_computers` ON `plugin_computers`.`computers_id` = `computers`.`id`
SET
`computers`.`last_boot` = `plugin_computers`.`last_boot`
WHERE `computers`.`last_boot` IS NULL
;"
);
$DB->doQueryOrDie(
"UPDATE `glpi_agents` AS `agents`
INNER JOIN (
SELECT
`computers_id`,
`remote_addr`
FROM `glpi_plugin_glpiinventory_inventorycomputercomputers`
) AS `plugin_computers` ON `plugin_computers`.`computers_id` = `agents`.`items_id` AND `agents`.`itemtype` = 'Computer'
SET
`agents`.`remote_addr` = `plugin_computers`.`remote_addr`
WHERE `agents`.`remote_addr` IS NULL OR `agents`.`remote_addr` = ''
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_inventorycomputercomputers');
}
$migration->displayMessage("Use core network equipments");
if ($DB->tableExists('glpi_plugin_glpiinventory_networkequipments')) {
// agents and snmp credentials must be migrated before that one
$DB->doQueryOrDie(
"UPDATE `glpi_networkequipments` AS `neteq`
INNER JOIN (
SELECT
`networkequipments_id`,
`plugin_glpiinventory_configsecurities_id`,
`sysdescr`,
`cpu`,
`uptime`,
`last_inventory_update`
FROM `glpi_plugin_glpiinventory_networkequipments`
) AS `plugin_neteq` ON `plugin_neteq`.`networkequipments_id` = `neteq`.`id`
SET
`neteq`.`snmpcredentials_id` = `plugin_neteq`.`plugin_glpiinventory_configsecurities_id`,
`neteq`.`sysdescr` = `plugin_neteq`.`sysdescr`,
`neteq`.`cpu` = `plugin_neteq`.`cpu`,
`neteq`.`uptime` = `plugin_neteq`.`uptime`,
`neteq`.`last_inventory_update` = `plugin_neteq`.`last_inventory_update`
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_networkequipments');
}
$migration->displayMessage("Use core printers");
if ($DB->tableExists('glpi_plugin_glpiinventory_printers')) {
// agents and snmp credentials must be migrated before that one
$DB->doQueryOrDie(
"UPDATE `glpi_printers` AS `printers`
INNER JOIN (
SELECT
`printers_id`,
`plugin_glpiinventory_configsecurities_id`,
`sysdescr`,
`last_inventory_update`
FROM `glpi_plugin_glpiinventory_printers`
) AS `plugin_printers` ON `plugin_printers`.`printers_id` = `printers`.`id`
SET
`printers`.`snmpcredentials_id` = `plugin_printers`.`plugin_glpiinventory_configsecurities_id`,
`printers`.`sysdescr` = `plugin_printers`.`sysdescr`,
`printers`.`last_inventory_update` = `plugin_printers`.`last_inventory_update`
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_printers');
}
$migration->dropTable('glpi_plugin_glpiinventory_printercartridges');
$migration->displayMessage("Use core printer logs");
if ($DB->tableExists('glpi_plugin_glpiinventory_printerlogs')) {
$DB->doQueryOrDie(
"INSERT IGNORE INTO `glpi_printerlogs` (
`printers_id`,
`date`,
`total_pages`,
`bw_pages`,
`color_pages`,
`rv_pages`,
`scanned`,
`prints`,
`bw_prints`,
`color_prints`,
`copies`,
`bw_copies`,
`color_copies`,
`faxed`,
`date_creation`,
`date_mod`
)
SELECT
`printers_id`,
DATE(`date`) as `log_date`,
`pages_total`,
`pages_n_b`,
`pages_color`,
`pages_recto_verso`,
`scanned`,
`pages_total_print`,
`pages_n_b_print`,
`pages_color_print`,
`pages_total_copy`,
`pages_n_b_copy`,
`pages_color_copy`,
`pages_total_fax`,
`date`,
`date`
FROM `glpi_plugin_glpiinventory_printerlogs`
WHERE `id` IN (SELECT MAX(`id`) as `id` from glpi_plugin_glpiinventory_printerlogs GROUP BY `printers_id`, DATE(`date`))
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_printerlogs');
}
$migration->displayMessage("Use core networkports logs");
if ($DB->tableExists('glpi_plugin_glpiinventory_networkportconnectionlogs')) {
$DB->doQueryOrDie(
"INSERT IGNORE INTO `glpi_networkportconnectionlogs` (
`date`,
`connected`,
`networkports_id_source`,
`networkports_id_destination`
)
SELECT
`date_mod`,
`creation`,
`networkports_id_source`,
`networkports_id_destination`
FROM `glpi_plugin_glpiinventory_networkportconnectionlogs`;"
);
$migration->dropTable('glpi_plugin_glpiinventory_networkportconnectionlogs');
}
$migration->displayMessage("Use core network ports types");
if ($DB->tableExists('glpi_plugin_glpiinventory_networkporttypes')) {
$DB->doQueryOrDie(
"UPDATE `glpi_networkporttypes` AS `types`
INNER JOIN (
SELECT
`name`,
`number`,
`import`
FROM `glpi_plugin_glpiinventory_networkporttypes`
) AS `plugin_types` ON `plugin_types`.`name` = `types`.`name` AND `plugin_types`.`number` = `types`.`value_decimal`
SET
`types`.`is_importable` = `plugin_types`.`import`
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_networkporttypes');
}
$migration->displayMessage("Use core unmanaged equipments");
if ($DB->tableExists('glpi_plugin_glpiinventory_unmanageds')) {
// agents and snmp credentials must be migrated before that one
$iterator = $DB->request([
'FROM' => 'glpi_plugin_glpiinventory_unmanageds'
]);
$unmanaged = new Unmanaged();
foreach ($iterator as $data_unmanaged) {
$old_id = $data_unmanaged['id'];
//mappings
$data_unmanaged['domains_id'] = $data_unmanaged['domain'];
$data_unmanaged['itemtype'] = $data_unmanaged['item_type'];
$data_unmanaged['snmpcredentials_id'] = $data_unmanaged['plugin_glpiinventory_configsecurities_id'];
unset(
$data_unmanaged['id'],
$data_unmanaged['domain'],
$data_unmanaged['item_type'],
$data_unmanaged['plugin_glpiinventory_configsecurities_id']
);
$new_id = $unmanaged->add(Toolbox::addslashes_deep($data_unmanaged));
$unmanageds_mapping[$old_id] = $new_id;
}
$migration->dropTable('glpi_plugin_glpiinventory_unmanageds');
}
$migration->displayMessage("Drop ignored equipments");
if ($DB->tableExists('glpi_plugin_glpiinventory_ignoredimportdevices')) {
$migration->dropTable('glpi_plugin_glpiinventory_ignoredimportdevices');
}
$migration->displayMessage("Use core rules");
// get max rankings
$rank_ria = 0;
$rank_rie = 0;
$rank_ril = 0;
$iterator = $DB->request([
'SELECT' => ['MAX' => 'ranking AS max_ranking'],
'FROM' => 'glpi_rules',
'WHERE' => ['sub_type' => 'RuleImportAsset']
]);
if (count($iterator)) {
$rank_ria = $iterator->current()['max_ranking'];
}
$iterator = $DB->request([
'SELECT' => ['MAX' => 'ranking AS max_ranking'],
'FROM' => 'glpi_rules',
'WHERE' => ['sub_type' => 'RuleImportEntity']
]);
if (count($iterator)) {
$rank_rie = $iterator->current()['max_ranking'];
}
$iterator = $DB->request([
'SELECT' => ['MAX' => 'ranking AS max_ranking'],
'FROM' => 'glpi_rules',
'WHERE' => ['sub_type' => 'RuleLocation']
]);
if (count($iterator)) {
$rank_ril = $iterator->current()['max_ranking'];
}
$DB->update(
'glpi_rules',
[
'sub_type' => 'RuleImportAsset',
'name' => new QueryExpression('CONCAT(' . $DB->quoteValue('[MIGRATED_FROM_FUSION]') . ', ' . $DB->quoteName('name') . ')'),
'ranking' => new QueryExpression($DB->quoteName('ranking') . " + " . ($rank_ria ?? 0))
],
[
'OR' => [
['sub_type' => 'PluginFusioninventoryInventoryRuleImport'],
['sub_type' => 'PluginGlpiinventoryInventoryRuleImport'],
['sub_type' => 'PluginFusioninventoryInventoryRuleRemotework']
]
]
);
$DB->update(
'glpi_rules',
[
'sub_type' => 'RuleImportEntity',
'name' => new QueryExpression('CONCAT(' . $DB->quoteValue('[MIGRATED_FROM_FUSION]') . ', ' . $DB->quoteName('name') . ')'),
'ranking' => new QueryExpression($DB->quoteName('ranking') . " + " . ($rank_rie ?? 0))
],
[
'OR' => [
['sub_type' => 'PluginFusinvinventoryRuleEntity'],
['sub_type' => 'PluginFusioninventoryInventoryRuleEntity']
]
]
);
$DB->update(
'glpi_rules',
[
'sub_type' => 'RuleLocation',
'name' => new QueryExpression('CONCAT(' . $DB->quoteValue('[MIGRATED_FROM_FUSION]') . ', ' . $DB->quoteName('name') . ')'),
'ranking' => new QueryExpression($DB->quoteName('ranking') . " + " . ($rank_ril ?? 0))
],
[
'sub_type' => 'PluginFusioninventoryInventoryRuleLocation'
]
);
//update _fusion action to _inventory
$DB->update(
'glpi_ruleactions',
[
'field' => '_inventory',
],
[
'field' => '_fusion',
]
);
if ($DB->tableExists('glpi_plugin_glpiinventory_rulematchedlogs')) {
// agents must be migrated before that one
$DB->doQueryOrDie(
"INSERT IGNORE INTO `glpi_rulematchedlogs` (
`date`,
`items_id`,
`itemtype`,
`rules_id`,
`agents_id`,
`method`
)
SELECT
`date`,
`items_id`,
`itemtype`,
`rules_id`,
`agents_id`,
`method`
FROM `glpi_plugin_glpiinventory_rulematchedlogs`;"
);
$migration->dropTable('glpi_plugin_glpiinventory_rulematchedlogs');
}
$migration->displayMessage("Use core remote management");
if ($DB->tableExists('glpi_plugin_glpiinventory_computerremotemanagements')) {
// agents must be migrated before that one
$DB->doQueryOrDie(
"INSERT IGNORE INTO `glpi_items_remotemanagements` (
`itemtype`,
`items_id`,
`remoteid`,
`type`,
`is_dynamic`
)
SELECT
'Computer',
`computers_id`,
`number`,
`type`,
1
FROM `glpi_plugin_glpiinventory_computerremotemanagements`;"
);
$migration->dropTable('glpi_plugin_glpiinventory_computerremotemanagements');
}
$migration->dropTable('glpi_plugin_glpiinventory_computerlicenseinfos');
$migration->displayMessage('Use core fields locks');
if ($DB->tableExists('glpi_plugin_glpiinventory_locks')) {
$lock = new Lockedfield();
$lock_table = $lock->getTable();
$iterator = $DB->request([
'FROM' => 'glpi_plugin_glpiinventory_locks'
]);
foreach ($iterator as $row) {
$fields = importArrayFromDB($row['tablefields']);
foreach ($fields as $field) {
$input = Toolbox::addslashes_deep(
[
'itemtype' => getItemTypeForTable($row['tablename']),
'items_id' => $row['items_id'],
'field' => $field,
'is_global' => ($row['items_id'] == 0) ? 1 : 0
]
);
if (countElementsInTable($lock_table, $input) > 0) {
continue; // Field is already locked
}
$lock->add($input);
}
}
$migration->dropTable('glpi_plugin_glpiinventory_locks');
}
$migration->displayMessage('Drop dblock tables');
$migration->dropTable('glpi_plugin_glpiinventory_dblockinventories');
$migration->dropTable('glpi_plugin_glpiinventory_dblockinventorynames');
$migration->dropTable('glpi_plugin_glpiinventory_dblocksoftwares');
$migration->dropTable('glpi_plugin_glpiinventory_dblocksoftwareversions');
$migration->displayMessage("Use core entities");
if ($DB->tableExists('glpi_plugin_glpiinventory_entities')) {
$DB->doQueryOrDie(
"UPDATE `glpi_entities` AS `entities`
INNER JOIN (
SELECT
`entities_id`,
`transfers_id_auto`,
`agent_base_url`
FROM `glpi_plugin_glpiinventory_entities`
) AS `plugin_entities` ON `plugin_entities`.`entities_id` = `entities`.`id`
SET
`entities`.`transfers_id` = `plugin_entities`.`transfers_id_auto`,
`entities`.`agent_base_url` = `plugin_entities`.`agent_base_url`
;"
);
$migration->dropTable('glpi_plugin_glpiinventory_entities');
}
$migration->displayMessage("Drop network ports and printers logs tables");
$migration->dropTable('glpi_plugin_glpiinventory_configlogfields');
$migration->dropTable('glpi_plugin_glpiinventory_networkportlogs');
$migration->displayMessage("Drop inventory mapping table");
$migration->dropTable('glpi_plugin_glpiinventory_mappings');
$migration->displayMessage("Drop blacklists tables");
$migration->dropTable('glpi_plugin_glpiinventory_inventorycomputerblacklists');
$migration->dropTable('glpi_plugin_glpiinventory_inventorycomputercriterias');
// Remove deleted crontasks
$crontask = new CronTask();
$crontask->deleteByCriteria(['itemtype' => 'PluginGlpiinventoryNetworkPortLog', 'name' => 'cleannetworkportlogs']);
$crontask->deleteByCriteria(['itemtype' => 'PluginGlpiinventoryAgent', 'name' => 'cleanoldagents']);
// Remove old display preferences
$displaypref = new DisplayPreference();
$displaypref->deleteByCriteria(['itemtype' => 'PluginGlpiinventoryAgent'], true, false);
$displaypref->deleteByCriteria(['itemtype' => 'PluginGlpiinventoryUnmanaged'], true, false);
//Fix old types
$types = [
'PluginGlpiinventoryAgent' => 'Agent',
'PluginGlpiinventoryUnmanaged' => 'Unmanaged'
];
$mappings = [
'Agent' => $agents_mapping,
'Unmanaged' => $unmanageds_mapping,
];
$types_iterator = $DB->request(
[
'SELECT' => [
'table_name AS TABLE_NAME',
'column_name AS COLUMN_NAME',
],
'FROM' => 'information_schema.columns',
'WHERE' => [
'table_schema' => $DB->dbdefault,
'table_name' => ['LIKE', 'glpi\_%'],
'OR' => [
['column_name' => 'itemtype'],
['column_name' => ['LIKE', 'itemtype_%']],
],
// Handle edge case where an id column (i.e. a kind of foreign key) is prefixed by `itemtype_`.
['NOT' => ['column_name' => ['LIKE', '%_id']]],
],
'ORDER' => 'TABLE_NAME',
]
);
foreach ($types_iterator as $type) {
$table_name = $type['TABLE_NAME'];
$itemtype_col = $type['COLUMN_NAME'];
$items_id_col = str_replace('itemtype', 'items_id', $itemtype_col);
foreach ($types as $orig_type => $new_type) {
if ($DB->fieldExists($table_name, $items_id_col)) {
// items_id field exists, update itemtype and items_id
// and remove data related to items that does not exists anymore
$mapping = $mappings[$new_type];
foreach ($mapping as $orig_id => $new_id) {
$migration->addPostQuery(
$DB->buildUpdate(
$table_name,
[
$itemtype_col => $new_type,
$items_id_col => $new_id
],
[
$itemtype_col => $orig_type,
$items_id_col => $orig_id
]
)
);
}
$migration->addPostQuery(
$DB->buildDelete(
$type['TABLE_NAME'],
[
$itemtype_col => $orig_type,
],
)
);
} else {
// items_id field does not exists, just rename the itemtype
$migration->addPostQuery(
$DB->buildUpdate(
$table_name,
[
$itemtype_col => $new_type,
],
[
$itemtype_col => $orig_type,
]
)
);
}
}
$migration->addPostQuery(
$DB->buildDelete(
$table_name,
[
$itemtype_col => 'PluginGlpiinventoryIgnoredimportdevice'
]
)
);
}
if ($DB->tableExists('glpi_plugin_glpiinventory_taskjobs')) {
$taskjobs_iterator = $DB->request(['FROM' => 'glpi_plugin_glpiinventory_taskjobs']);
foreach ($taskjobs_iterator as $taskjob) {
$updated_values = [
'actors' => [],
'targets' => [],
];
foreach (['actors', 'targets'] as $fieldname) {
$existing_values = importArrayFromDB($taskjob[$fieldname]);
foreach ($existing_values as $item_specs) {
$itemtype = key($item_specs);
$items_id = current($item_specs);
if ($itemtype === 'PluginGlpiinventoryAgent' || $itemtype === 'PluginFusioninventoryAgent') {
$itemtype = 'Agent';
if (array_key_exists($items_id, $agents_mapping)) {
$items_id = $agents_mapping[$items_id];
}
} else {
$itemtype = str_replace('PluginFusioninventory', 'PluginGlpiinventory', $itemtype);
}
$updated_values[$fieldname][] = [$itemtype => $items_id];
}
}
$DB->doQueryOrDie(
$DB->buildUpdate(
'glpi_plugin_glpiinventory_taskjobs',
[
'actors' => exportArrayToDB($updated_values['actors']),
'targets' => exportArrayToDB($updated_values['targets'])
],
[
'id' => $taskjob['id']
]
)
);
}
//new field
$migration->addField('glpi_plugin_glpiinventory_taskjobs', 'restrict_to_task_entity', 'bool', ['value' => '1']);
}
// Use core configuration entries
$plugin_configs = $DB->request('glpi_plugin_glpiinventory_configs');
$mapping = [
'agents_action' => 'stale_agents_action',
'agents_old_days' => 'stale_agents_delay',
'agents_status' => 'stale_agents_status',
];
foreach ($plugin_configs as $plugin_config) {
$plugin_name = $plugin_config['type'];
if (array_key_exists($plugin_name, $mapping)) {
$glpi_name = $mapping[$plugin_name];
if (Config::getConfigurationValue('inventory', $glpi_name) == null) {
// Only set configuration if it has never been set in GLPI
Config::setConfigurationValues(
'inventory',
[
$glpi_name => $plugin_config['value'],
]
);
}
// Delete configuration, value, it is not needed anymore
$migration->addPostQuery(
$DB->buildDelete('glpi_plugin_glpiinventory_configs', ['id' => $plugin_config['id']])
);
}
}
$DB->doQueryOrDie(
$DB->buildDelete(
'glpi_plugin_glpiinventory_agentmodules',
[
'modulename' => 'WAKEONLAN'
]
)
);
$DB->doQueryOrDie(
$DB->buildDelete(
'glpi_displaypreferences',
[
'itemtype' => 'Computer',
'num' => 5165
]
)
);
// /!\ Keep it at the end
$migration->executeMigration();
}