|
|
|
@ -35,8 +35,8 @@ use OC\Hooks\BasicEmitter;
|
|
|
|
|
use OC\IntegrityCheck\Checker;
|
|
|
|
|
use OC_App;
|
|
|
|
|
use OCP\IConfig;
|
|
|
|
|
use OC\Setup;
|
|
|
|
|
use OCP\ILogger;
|
|
|
|
|
use OCP\Util;
|
|
|
|
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -59,12 +59,6 @@ class Updater extends BasicEmitter {
|
|
|
|
|
/** @var Checker */
|
|
|
|
|
private $checker;
|
|
|
|
|
|
|
|
|
|
/** @var bool */
|
|
|
|
|
private $simulateStepEnabled;
|
|
|
|
|
|
|
|
|
|
/** @var bool */
|
|
|
|
|
private $updateStepEnabled;
|
|
|
|
|
|
|
|
|
|
/** @var bool */
|
|
|
|
|
private $skip3rdPartyAppsDisable;
|
|
|
|
|
|
|
|
|
@ -87,29 +81,6 @@ class Updater extends BasicEmitter {
|
|
|
|
|
$this->log = $log;
|
|
|
|
|
$this->config = $config;
|
|
|
|
|
$this->checker = $checker;
|
|
|
|
|
$this->simulateStepEnabled = true;
|
|
|
|
|
$this->updateStepEnabled = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets whether the database migration simulation must
|
|
|
|
|
* be enabled.
|
|
|
|
|
* This can be set to false to skip this test.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $flag true to enable simulation, false otherwise
|
|
|
|
|
*/
|
|
|
|
|
public function setSimulateStepEnabled($flag) {
|
|
|
|
|
$this->simulateStepEnabled = $flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets whether the update must be performed.
|
|
|
|
|
* This can be set to false to skip the actual update.
|
|
|
|
|
*
|
|
|
|
|
* @param bool $flag true to enable update, false otherwise
|
|
|
|
|
*/
|
|
|
|
|
public function setUpdateStepEnabled($flag) {
|
|
|
|
|
$this->updateStepEnabled = $flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -131,9 +102,9 @@ class Updater extends BasicEmitter {
|
|
|
|
|
public function upgrade() {
|
|
|
|
|
$this->emitRepairEvents();
|
|
|
|
|
|
|
|
|
|
$logLevel = $this->config->getSystemValue('loglevel', \OCP\Util::WARN);
|
|
|
|
|
$logLevel = $this->config->getSystemValue('loglevel', Util::WARN);
|
|
|
|
|
$this->emit('\OC\Updater', 'setDebugLogLevel', [ $logLevel, $this->logLevelNames[$logLevel] ]);
|
|
|
|
|
$this->config->setSystemValue('loglevel', \OCP\Util::DEBUG);
|
|
|
|
|
$this->config->setSystemValue('loglevel', Util::DEBUG);
|
|
|
|
|
|
|
|
|
|
$wasMaintenanceModeEnabled = $this->config->getSystemValue('maintenance', false);
|
|
|
|
|
|
|
|
|
@ -254,68 +225,48 @@ class Updater extends BasicEmitter {
|
|
|
|
|
$repair = new Repair(Repair::getBeforeUpgradeRepairSteps(), \OC::$server->getEventDispatcher());
|
|
|
|
|
$repair->run();
|
|
|
|
|
|
|
|
|
|
// simulate DB upgrade
|
|
|
|
|
if ($this->simulateStepEnabled) {
|
|
|
|
|
$this->checkCoreUpgrade();
|
|
|
|
|
|
|
|
|
|
// simulate apps DB upgrade
|
|
|
|
|
$this->checkAppUpgrade($currentVersion);
|
|
|
|
|
$this->doCoreUpgrade();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// TODO: replace with the new repair step mechanism https://github.com/owncloud/core/pull/24378
|
|
|
|
|
Setup::installBackgroundJobs();
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
throw new \Exception($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($this->updateStepEnabled) {
|
|
|
|
|
$this->doCoreUpgrade();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// TODO: replace with the new repair step mechanism https://github.com/owncloud/core/pull/24378
|
|
|
|
|
Setup::installBackgroundJobs();
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
throw new \Exception($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update all shipped apps
|
|
|
|
|
$disabledApps = $this->checkAppsRequirements();
|
|
|
|
|
$this->doAppUpgrade();
|
|
|
|
|
// update all shipped apps
|
|
|
|
|
$disabledApps = $this->checkAppsRequirements();
|
|
|
|
|
$this->doAppUpgrade();
|
|
|
|
|
|
|
|
|
|
// upgrade appstore apps
|
|
|
|
|
$this->upgradeAppStoreApps($disabledApps);
|
|
|
|
|
|
|
|
|
|
// install new shipped apps on upgrade
|
|
|
|
|
OC_App::loadApps('authentication');
|
|
|
|
|
$errors = Installer::installShippedApps(true);
|
|
|
|
|
foreach ($errors as $appId => $exception) {
|
|
|
|
|
/** @var \Exception $exception */
|
|
|
|
|
$this->log->logException($exception, ['app' => $appId]);
|
|
|
|
|
$this->emit('\OC\Updater', 'failure', [$appId . ': ' . $exception->getMessage()]);
|
|
|
|
|
}
|
|
|
|
|
// upgrade appstore apps
|
|
|
|
|
$this->upgradeAppStoreApps($disabledApps);
|
|
|
|
|
|
|
|
|
|
// post-upgrade repairs
|
|
|
|
|
$repair = new Repair(Repair::getRepairSteps(), \OC::$server->getEventDispatcher());
|
|
|
|
|
$repair->run();
|
|
|
|
|
// install new shipped apps on upgrade
|
|
|
|
|
OC_App::loadApps('authentication');
|
|
|
|
|
$errors = Installer::installShippedApps(true);
|
|
|
|
|
foreach ($errors as $appId => $exception) {
|
|
|
|
|
/** @var \Exception $exception */
|
|
|
|
|
$this->log->logException($exception, ['app' => $appId]);
|
|
|
|
|
$this->emit('\OC\Updater', 'failure', [$appId . ': ' . $exception->getMessage()]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Invalidate update feed
|
|
|
|
|
$this->config->setAppValue('core', 'lastupdatedat', 0);
|
|
|
|
|
// post-upgrade repairs
|
|
|
|
|
$repair = new Repair(Repair::getRepairSteps(), \OC::$server->getEventDispatcher());
|
|
|
|
|
$repair->run();
|
|
|
|
|
|
|
|
|
|
// Check for code integrity if not disabled
|
|
|
|
|
if(\OC::$server->getIntegrityCodeChecker()->isCodeCheckEnforced()) {
|
|
|
|
|
$this->emit('\OC\Updater', 'startCheckCodeIntegrity');
|
|
|
|
|
$this->checker->runInstanceVerification();
|
|
|
|
|
$this->emit('\OC\Updater', 'finishedCheckCodeIntegrity');
|
|
|
|
|
}
|
|
|
|
|
//Invalidate update feed
|
|
|
|
|
$this->config->setAppValue('core', 'lastupdatedat', 0);
|
|
|
|
|
|
|
|
|
|
// only set the final version if everything went well
|
|
|
|
|
$this->config->setSystemValue('version', implode('.', \OCP\Util::getVersion()));
|
|
|
|
|
$this->config->setAppValue('core', 'vendor', $this->getVendor());
|
|
|
|
|
// Check for code integrity if not disabled
|
|
|
|
|
if(\OC::$server->getIntegrityCodeChecker()->isCodeCheckEnforced()) {
|
|
|
|
|
$this->emit('\OC\Updater', 'startCheckCodeIntegrity');
|
|
|
|
|
$this->checker->runInstanceVerification();
|
|
|
|
|
$this->emit('\OC\Updater', 'finishedCheckCodeIntegrity');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function checkCoreUpgrade() {
|
|
|
|
|
$this->emit('\OC\Updater', 'dbSimulateUpgradeBefore');
|
|
|
|
|
|
|
|
|
|
// simulate core DB upgrade
|
|
|
|
|
\OC_DB::simulateUpdateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
|
|
|
|
|
|
|
|
|
|
$this->emit('\OC\Updater', 'dbSimulateUpgrade');
|
|
|
|
|
// only set the final version if everything went well
|
|
|
|
|
$this->config->setSystemValue('version', implode('.', Util::getVersion()));
|
|
|
|
|
$this->config->setAppValue('core', 'vendor', $this->getVendor());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function doCoreUpgrade() {
|
|
|
|
@ -424,7 +375,7 @@ class Updater extends BasicEmitter {
|
|
|
|
|
private function checkAppsRequirements() {
|
|
|
|
|
$isCoreUpgrade = $this->isCodeUpgrade();
|
|
|
|
|
$apps = OC_App::getEnabledApps();
|
|
|
|
|
$version = \OCP\Util::getVersion();
|
|
|
|
|
$version = Util::getVersion();
|
|
|
|
|
$disabledApps = [];
|
|
|
|
|
foreach ($apps as $app) {
|
|
|
|
|
// check if the app is compatible with this version of ownCloud
|
|
|
|
@ -461,7 +412,7 @@ class Updater extends BasicEmitter {
|
|
|
|
|
*/
|
|
|
|
|
private function isCodeUpgrade() {
|
|
|
|
|
$installedVersion = $this->config->getSystemValue('version', '0.0.0');
|
|
|
|
|
$currentVersion = implode('.', \OCP\Util::getVersion());
|
|
|
|
|
$currentVersion = implode('.', Util::getVersion());
|
|
|
|
|
if (version_compare($currentVersion, $installedVersion, '>')) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|