Files
MYSOPHAL/inc/update.class.php
2025-08-07 13:15:31 +01:00

638 lines
18 KiB
PHP

<?php
/**
* ---------------------------------------------------------------------
* GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2015-2020 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* GLPI is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GLPI 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/**
* Update class
**/
class Update extends CommonGLPI {
private $args = [];
private $DB;
private $migration;
private $version;
private $dbversion;
private $language;
/**
* Constructor
*
* @param object $DB Database instance
* @param array $args Command line arguments; default to empty array
*/
public function __construct($DB, $args = []) {
$this->DB = $DB;
$this->args = $args;
$this->declareOldItems();
}
/**
* Initialize session for update
*
* @return void
*/
public function initSession() {
if (is_writable(GLPI_SESSION_DIR)) {
Session::setPath();
} else {
if (isCommandLine()) {
die("Can't write in ".GLPI_SESSION_DIR."\n");
}
}
Session::start();
if (isCommandLine()) {
// Init debug variable
$_SESSION = ['glpilanguage' => (isset($this->args['lang']) ? $this->args['lang'] : 'en_GB')];
$_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s");
}
// Init debug variable
// Only show errors
Toolbox::setDebugMode(Session::DEBUG_MODE, 0, 0, 1);
}
/**
* Get current values (versions, lang, ...)
*
* @return array
*/
public function getCurrents() {
$currents = [];
$DB = $this->DB;
if (!$DB->tableExists('glpi_config') && !$DB->tableExists('glpi_configs')) {
//very, very old version!
$currents = [
'version' => '0.1',
'dbversion' => '0.1',
'language' => 'en_GB'
];
} else if (!$DB->tableExists("glpi_configs")) {
// < 0.78
// Get current version
$result = $DB->request([
'SELECT' => ['version', 'language'],
'FROM' => 'glpi_config'
])->next();
$currents['version'] = trim($result['version']);
$currents['dbversion'] = $currents['version'];
$currents['language'] = trim($result['language']);
} else if ($DB->fieldExists('glpi_configs', 'version')) {
// < 0.85
// Get current version and language
$result = $DB->request([
'SELECT' => ['version', 'language'],
'FROM' => 'glpi_configs'
])->next();
$currents['version'] = trim($result['version']);
$currents['dbversion'] = $currents['version'];
$currents['language'] = trim($result['language']);
} else {
$currents = Config::getConfigurationValues(
'core',
['version', 'dbversion', 'language']
);
if (!isset($currents['dbversion'])) {
$currents['dbversion'] = $currents['version'];
}
}
$this->version = $currents['version'];
$this->dbversion = $currents['dbversion'];
$this->language = $currents['language'];
return $currents;
}
/**
* Run updates
*
* @param string $current_version Current version
*
* @return void
*/
public function doUpdates($current_version = null) {
if ($current_version === null) {
if ($this->version === null) {
throw new \RuntimeException('Cannot process updates without any version specified!');
}
$current_version = $this->version;
}
$DB = $this->DB;
// To prevent problem of execution time
ini_set("max_execution_time", "0");
$updir = __DIR__ . "/../install/";
if (isCommandLine() && version_compare($current_version, '0.72.3', 'lt')) {
echo 'Upgrade from command line is not supported before 0.72.3!';
die(1);
}
// Update process desactivate all plugins
$plugin = new Plugin();
$plugin->unactivateAll();
switch ($current_version) {
case '0.1':
include_once("update_to_031.php");
updateDbTo031();
case "0.31" :
$ret = [];
include_once "{$updir}update_031_04.php";
update031to04();
if (!empty($ret) && $ret["adminchange"]) {
echo "<div class='center'> <h2>". __("All users having administrators rights have have been updated to 'super-admin' rights with the creation of his new user type.") ."<h2></div>";
}
case "0.4" :
case "0.41" :
include_once("{$updir}update_04_042.php");
update04to042();
case "0.42" :
showLocationUpdateForm();
include_once("{$updir}update_042_05.php");
update042to05();
case "0.5" :
include_once("{$updir}update_05_051.php");
update05to051();
case "0.51" :
case "0.51a" :
include_once("{$updir}update_051_06.php");
update051to06();
case "0.6" :
include_once("{$updir}update_06_065.php");
update06to065();
case "0.65" :
include_once("{$updir}update_065_068.php");
update065to068();
case "0.68" :
include_once("{$updir}update_068_0681.php");
update068to0681();
case "0.68.1" :
case "0.68.2" :
case "0.68.3" :
// Force update content
if (showLocationUpdateForm()) {
$DB->updateOrDie(
'glpi_config',
['version' => ' 0.68.3x'],
[0],
'0.68.3'
);
showContentUpdateForm();
exit();
}
case "0.68.3x": // Special version for replay upgrade process from here
include_once("{$updir}update_0681_07.php");
update0681to07();
case "0.7" :
case "0.70.1" :
case "0.70.2" :
include_once("{$updir}update_07_071.php");
update07to071();
case "0.71" :
case "0.71.1" :
include_once("{$updir}update_071_0712.php");
update071to0712();
case "0.71.2" :
include_once("{$updir}update_0712_0713.php");
update0712to0713();
case "0.71.3" :
case "0.71.4" :
case "0.71.5" :
case "0.71.6" :
include_once("{$updir}update_0713_072.php");
update0713to072();
case "0.72" :
include_once("{$updir}update_072_0721.php");
update072to0721();
case "0.72.1" :
include_once("{$updir}update_0721_0722.php");
update0721to0722();
case "0.72.2" :
case "0.72.21" :
include_once("{$updir}update_0722_0723.php");
update0722to0723();
case "0.72.3" :
case "0.72.4" :
include_once("{$updir}update_0723_078.php");
update0723to078();
case "0.78" :
include_once("{$updir}update_078_0781.php");
update078to0781();
case "0.78.1" :
include_once("{$updir}update_0781_0782.php");
update0781to0782();
case "0.78.2":
case "0.78.3":
case "0.78.4":
case "0.78.5":
include_once("{$updir}update_0782_080.php");
update0782to080();
case "0.80" :
include_once("{$updir}update_080_0801.php");
update080to0801();
case "0.80.1" :
case "0.80.2" :
include_once("{$updir}update_0801_0803.php");
update0801to0803();
case "0.80.3" :
case "0.80.4" :
case "0.80.5" :
case "0.80.6" :
case "0.80.61" :
case "0.80.7" :
include_once("{$updir}update_0803_083.php");
update0803to083();
case "0.83" :
include_once("{$updir}update_083_0831.php");
update083to0831();
case "0.83.1" :
case "0.83.2" :
include_once("{$updir}update_0831_0833.php");
update0831to0833();
case "0.83.3" :
case "0.83.31" :
case "0.83.4" :
case "0.83.5" :
case "0.83.6" :
case "0.83.7" :
case "0.83.8" :
case "0.83.9" :
case "0.83.91" :
include_once("{$updir}update_0831_084.php");
update0831to084();
case "0.84" :
include_once("{$updir}update_084_0841.php");
update084to0841();
case "0.84.1" :
case "0.84.2" :
include_once("{$updir}update_0841_0843.php");
update0841to0843();
case "0.84.3" :
include_once("{$updir}update_0843_0844.php");
update0843to0844();
case "0.84.4" :
case "0.84.5" :
include_once("{$updir}update_0845_0846.php");
update0845to0846();
case "0.84.6" :
case "0.84.7" :
case "0.84.8" :
case "0.84.9" :
include_once("{$updir}update_084_085.php");
update084to085();
case "0.85" :
case "0.85.1" :
case "0.85.2" :
include_once("{$updir}update_085_0853.php");
update085to0853();
case "0.85.3" :
case "0.85.4" :
include_once("{$updir}update_0853_0855.php");
update0853to0855();
case "0.85.5" :
include_once("{$updir}update_0855_090.php");
update0855to090();
case "0.90" :
include_once("{$updir}update_090_0901.php");
update090to0901();
case "0.90.1" :
case "0.90.2" :
case "0.90.3" :
case "0.90.4" :
include_once("{$updir}update_0901_0905.php");
update0901to0905();
case "0.90.5" :
include_once("{$updir}update_0905_91.php");
update0905to91();
case "9.1" :
case "0.91":
include_once("{$updir}update_91_911.php");
update91to911();
case "9.1.1":
case "9.1.2":
include_once("{$updir}update_911_913.php");
update911to913();
case "9.1.3":
case "9.1.4":
case "9.1.5":
case "9.1.6":
case "9.1.7":
case "9.1.7.1":
case "9.1.8":
case "9.2-dev":
include_once("{$updir}update_91_92.php");
update91to92();
case "9.2":
include_once("{$updir}update_92_921.php");
update92to921();
case "9.2.1":
include_once("{$updir}update_921_922.php");
update921to922();
case "9.2.2":
//9.2.2 upgrade script was not run from the release, see https://github.com/glpi-project/glpi/issues/3659
//see https://github.com/glpi-project/glpi/issues/3659
include_once("{$updir}update_921_922.php");
update921to922();
include_once("{$updir}update_922_923.php");
update922to923();
case "9.2.3":
case "9.2.4":
case "9.3-dev":
include_once("{$updir}update_92_93.php");
update92to93();
case "9.3":
case "9.3.0":
include_once "{$updir}update_930_931.php";
update930to931();
case "9.3.1":
include_once "{$updir}update_931_932.php";
update931to932();
case "9.3.2":
case "9.3.3":
case "9.3.4":
case "9.3.5":
case "9.4.0-dev":
include_once("{$updir}update_93_94.php");
update93to94();
case "9.4.0":
include_once "{$updir}update_940_941.php";
update940to941();
case "9.4.1":
case "9.4.1.1":
include_once "{$updir}update_941_942.php";
update941to942();
case "9.4.2":
include_once "{$updir}update_942_943.php";
update942to943();
case "9.4.3":
case "9.4.4":
include_once "{$updir}update_943_945.php";
update943to945();
case "9.4.5":
include_once "{$updir}update_945_946.php";
update945to946();
case "9.4.6":
include_once "{$updir}update_946_947.php";
update946to947();
case "9.4.7":
case "9.4.8":
case "9.4.9":
case "9.5.0-dev":
include_once "{$updir}update_94_95.php";
update94to95();
case "9.5.0":
case "9.5.1":
include_once "{$updir}update_951_952.php";
update951to952();
break;
case GLPI_VERSION:
case GLPI_SCHEMA_VERSION:
break;
default :
$message = sprintf(
__('Unsupported version (%1$s)'),
$current_version
);
if (isCommandLine()) {
echo "$message\n";
die(1);
} else {
$this->migration->displayWarning($message, true);
die(1);
}
}
// Update version number and default langage and new version_founded ---- LEAVE AT THE END
Config::setConfigurationValues('core', ['version' => GLPI_VERSION,
'dbversion' => GLPI_SCHEMA_VERSION,
'language' => $this->language,
'founded_new_version' => '']);
if (defined('GLPI_SYSTEM_CRON')) {
// Downstream packages may provide a good system cron
$DB->updateOrDie(
'glpi_crontasks', [
'mode' => 2
], [
'name' => ['!=', 'watcher'],
'allowmode' => ['&', 2]
]
);
}
// reset telemetry
$crontask_telemetry = new CronTask;
$crontask_telemetry->getFromDBbyName("Telemetry", "telemetry");
$crontask_telemetry->resetDate();
$crontask_telemetry->resetState();
//generate security key if missing, and update db
$glpikey = new GLPIKey();
if (!$glpikey->keyExists() && !$glpikey->generate()) {
$this->migration->displayWarning(__('Unable to create security key file! You have to run "php bin/console glpi:security:change_key" command to manually create this file.'), true);
}
}
/**
* Declare old items for compatibility
*
* @return void
*/
public function declareOldItems() {
// Old itemtypes
define("GENERAL_TYPE", 0);
define("COMPUTER_TYPE", 1);
define("NETWORKING_TYPE", 2);
define("PRINTER_TYPE", 3);
define("MONITOR_TYPE", 4);
define("PERIPHERAL_TYPE", 5);
define("SOFTWARE_TYPE", 6);
define("CONTACT_TYPE", 7);
define("ENTERPRISE_TYPE", 8);
define("INFOCOM_TYPE", 9);
define("CONTRACT_TYPE", 10);
define("CARTRIDGEITEM_TYPE", 11);
define("TYPEDOC_TYPE", 12);
define("DOCUMENT_TYPE", 13);
define("KNOWBASE_TYPE", 14);
define("USER_TYPE", 15);
define("TRACKING_TYPE", 16);
define("CONSUMABLEITEM_TYPE", 17);
define("CONSUMABLE_TYPE", 18);
define("CARTRIDGE_TYPE", 19);
define("SOFTWARELICENSE_TYPE", 20);
define("LINK_TYPE", 21);
define("STATE_TYPE", 22);
define("PHONE_TYPE", 23);
define("DEVICE_TYPE", 24);
define("REMINDER_TYPE", 25);
define("STAT_TYPE", 26);
define("GROUP_TYPE", 27);
define("ENTITY_TYPE", 28);
define("RESERVATION_TYPE", 29);
define("AUTHMAIL_TYPE", 30);
define("AUTHLDAP_TYPE", 31);
define("OCSNG_TYPE", 32);
define("REGISTRY_TYPE", 33);
define("PROFILE_TYPE", 34);
define("MAILGATE_TYPE", 35);
define("RULE_TYPE", 36);
define("TRANSFER_TYPE", 37);
define("BOOKMARK_TYPE", 38);
define("SOFTWAREVERSION_TYPE", 39);
define("PLUGIN_TYPE", 40);
define("COMPUTERDISK_TYPE", 41);
define("NETWORKING_PORT_TYPE", 42);
define("FOLLOWUP_TYPE", 43);
define("BUDGET_TYPE", 44);
// Old devicetypes
define("MOBOARD_DEVICE", 1);
define("PROCESSOR_DEVICE", 2);
define("RAM_DEVICE", 3);
define("HDD_DEVICE", 4);
define("NETWORK_DEVICE", 5);
define("DRIVE_DEVICE", 6);
define("CONTROL_DEVICE", 7);
define("GFX_DEVICE", 8);
define("SND_DEVICE", 9);
define("PCI_DEVICE", 10);
define("CASE_DEVICE", 11);
define("POWER_DEVICE", 12);
}
/**
* Set migration
*
* @param Migration $migration Migration instance
*
* @return Update
*/
public function setMigration(Migration $migration) {
$this->migration = $migration;
return $this;
}
/**
* Check if expected security key file is missing.
*
* @return bool
*/
public function isExpectedSecurityKeyFileMissing(): bool {
$expected_key_path = $this->getExpectedSecurityKeyFilePath();
if ($expected_key_path === null) {
return false;
}
return !file_exists($expected_key_path);
}
/**
* Returns expected security key file path.
* Will return null for GLPI versions that was not yet handling a custom security key.
*
* @return string|null
*/
public function getExpectedSecurityKeyFilePath(): ?string {
$glpikey = new GLPIKey();
return $glpikey->getExpectedKeyPath($this->getCurrents()['version']);
}
}