|
|
@@ -30,6 +30,9 @@ |
|
|
|
namespace OC; |
|
|
|
|
|
|
|
use OC\Hooks\BasicEmitter; |
|
|
|
use OC_App; |
|
|
|
use OC_Util; |
|
|
|
use OCP\IConfig; |
|
|
|
|
|
|
|
/** |
|
|
|
* Class that handles autoupdating of ownCloud |
|
|
@@ -42,29 +45,27 @@ use OC\Hooks\BasicEmitter; |
|
|
|
*/ |
|
|
|
class Updater extends BasicEmitter { |
|
|
|
|
|
|
|
/** |
|
|
|
* @var \OC\Log $log |
|
|
|
*/ |
|
|
|
/** @var \OC\Log $log */ |
|
|
|
private $log; |
|
|
|
|
|
|
|
/** |
|
|
|
* @var \OC\HTTPHelper $helper; |
|
|
|
*/ |
|
|
|
/** @var \OC\HTTPHelper $helper */ |
|
|
|
private $httpHelper; |
|
|
|
|
|
|
|
/** |
|
|
|
* @var \OCP\IAppConfig; |
|
|
|
*/ |
|
|
|
/** @var IConfig */ |
|
|
|
private $config; |
|
|
|
|
|
|
|
/** @var bool */ |
|
|
|
private $simulateStepEnabled; |
|
|
|
|
|
|
|
/** @var bool */ |
|
|
|
private $updateStepEnabled; |
|
|
|
|
|
|
|
/** |
|
|
|
* @param HTTPHelper $httpHelper |
|
|
|
* @param IConfig $config |
|
|
|
* @param \OC\Log $log |
|
|
|
*/ |
|
|
|
public function __construct($httpHelper, $config, $log = null) { |
|
|
|
public function __construct(HTTPHelper $httpHelper, IConfig $config, $log = null) { |
|
|
|
$this->httpHelper = $httpHelper; |
|
|
|
$this->log = $log; |
|
|
|
$this->config = $config; |
|
|
@@ -102,23 +103,23 @@ class Updater extends BasicEmitter { |
|
|
|
public function check($updaterUrl = null) { |
|
|
|
|
|
|
|
// Look up the cache - it is invalidated all 30 minutes |
|
|
|
if (($this->config->getValue('core', 'lastupdatedat') + 1800) > time()) { |
|
|
|
return json_decode($this->config->getValue('core', 'lastupdateResult'), true); |
|
|
|
if (((int)$this->config->getAppValue('core', 'lastupdatedat') + 1800) > time()) { |
|
|
|
return json_decode($this->config->getAppValue('core', 'lastupdateResult'), true); |
|
|
|
} |
|
|
|
|
|
|
|
if (is_null($updaterUrl)) { |
|
|
|
$updaterUrl = 'https://apps.owncloud.com/updater.php'; |
|
|
|
} |
|
|
|
|
|
|
|
$this->config->setValue('core', 'lastupdatedat', time()); |
|
|
|
$this->config->setAppValue('core', 'lastupdatedat', time()); |
|
|
|
|
|
|
|
if ($this->config->getValue('core', 'installedat', '') == '') { |
|
|
|
$this->config->setValue('core', 'installedat', microtime(true)); |
|
|
|
if ($this->config->getAppValue('core', 'installedat', '') == '') { |
|
|
|
$this->config->setAppValue('core', 'installedat', microtime(true)); |
|
|
|
} |
|
|
|
|
|
|
|
$version = \OC_Util::getVersion(); |
|
|
|
$version['installed'] = $this->config->getValue('core', 'installedat'); |
|
|
|
$version['updated'] = $this->config->getValue('core', 'lastupdatedat'); |
|
|
|
$version['installed'] = $this->config->getAppValue('core', 'installedat'); |
|
|
|
$version['updated'] = $this->config->getAppValue('core', 'lastupdatedat'); |
|
|
|
$version['updatechannel'] = \OC_Util::getChannel(); |
|
|
|
$version['edition'] = \OC_Util::getEditionString(); |
|
|
|
$version['build'] = \OC_Util::getBuild(); |
|
|
@@ -146,7 +147,7 @@ class Updater extends BasicEmitter { |
|
|
|
} |
|
|
|
|
|
|
|
// Cache the result |
|
|
|
$this->config->setValue('core', 'lastupdateResult', json_encode($data)); |
|
|
|
$this->config->setAppValue('core', 'lastupdateResult', json_encode($data)); |
|
|
|
return $tmp; |
|
|
|
} |
|
|
|
|
|
|
@@ -157,9 +158,9 @@ class Updater extends BasicEmitter { |
|
|
|
* @return bool true if the operation succeeded, false otherwise |
|
|
|
*/ |
|
|
|
public function upgrade() { |
|
|
|
\OC_Config::setValue('maintenance', true); |
|
|
|
$this->config->setSystemValue('maintenance', true); |
|
|
|
|
|
|
|
$installedVersion = \OC_Config::getValue('version', '0.0.0'); |
|
|
|
$installedVersion = $this->config->getSystemValue('version', '0.0.0'); |
|
|
|
$currentVersion = implode('.', \OC_Util::getVersion()); |
|
|
|
if ($this->log) { |
|
|
|
$this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core')); |
|
|
@@ -172,7 +173,7 @@ class Updater extends BasicEmitter { |
|
|
|
$this->emit('\OC\Updater', 'failure', array($exception->getMessage())); |
|
|
|
} |
|
|
|
|
|
|
|
\OC_Config::setValue('maintenance', false); |
|
|
|
$this->config->setSystemValue('maintenance', false); |
|
|
|
$this->emit('\OC\Updater', 'maintenanceEnd'); |
|
|
|
} |
|
|
|
|
|
|
@@ -220,10 +221,10 @@ class Updater extends BasicEmitter { |
|
|
|
// create empty file in data dir, so we can later find |
|
|
|
// out that this is indeed an ownCloud data directory |
|
|
|
// (in case it didn't exist before) |
|
|
|
file_put_contents(\OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/.ocdata', ''); |
|
|
|
file_put_contents($this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/.ocdata', ''); |
|
|
|
|
|
|
|
// pre-upgrade repairs |
|
|
|
$repair = new \OC\Repair(\OC\Repair::getBeforeUpgradeRepairSteps()); |
|
|
|
$repair = new Repair(Repair::getBeforeUpgradeRepairSteps()); |
|
|
|
$repair->run(); |
|
|
|
|
|
|
|
// simulate DB upgrade |
|
|
@@ -238,22 +239,18 @@ class Updater extends BasicEmitter { |
|
|
|
if ($this->updateStepEnabled) { |
|
|
|
$this->doCoreUpgrade(); |
|
|
|
|
|
|
|
$disabledApps = \OC_App::checkAppsRequirements(); |
|
|
|
if (!empty($disabledApps)) { |
|
|
|
$this->emit('\OC\Updater', 'disabledApps', array($disabledApps)); |
|
|
|
} |
|
|
|
|
|
|
|
$this->checkAppsRequirements(); |
|
|
|
$this->doAppUpgrade(); |
|
|
|
|
|
|
|
// post-upgrade repairs |
|
|
|
$repair = new \OC\Repair(\OC\Repair::getRepairSteps()); |
|
|
|
$repair = new Repair(Repair::getRepairSteps()); |
|
|
|
$repair->run(); |
|
|
|
|
|
|
|
//Invalidate update feed |
|
|
|
$this->config->setValue('core', 'lastupdatedat', 0); |
|
|
|
$this->config->setAppValue('core', 'lastupdatedat', 0); |
|
|
|
|
|
|
|
// only set the final version if everything went well |
|
|
|
\OC_Config::setValue('version', implode('.', \OC_Util::getVersion())); |
|
|
|
$this->config->setSystemValue('version', implode('.', \OC_Util::getVersion())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -278,14 +275,11 @@ class Updater extends BasicEmitter { |
|
|
|
$apps = \OC_App::getEnabledApps(); |
|
|
|
|
|
|
|
foreach ($apps as $appId) { |
|
|
|
if ($version) { |
|
|
|
$info = \OC_App::getAppInfo($appId); |
|
|
|
$compatible = \OC_App::isAppCompatible($version, $info); |
|
|
|
} else { |
|
|
|
$compatible = true; |
|
|
|
} |
|
|
|
$info = \OC_App::getAppInfo($appId); |
|
|
|
$compatible = \OC_App::isAppCompatible($version, $info); |
|
|
|
$isShipped = \OC_App::isShipped($appId); |
|
|
|
|
|
|
|
if ($compatible && \OC_App::shouldUpgrade($appId)) { |
|
|
|
if ($compatible && $isShipped && \OC_App::shouldUpgrade($appId)) { |
|
|
|
/** |
|
|
|
* FIXME: The preupdate check is performed before the database migration, otherwise database changes |
|
|
|
* are not possible anymore within it. - Consider this when touching the code. |
|
|
@@ -356,5 +350,28 @@ class Updater extends BasicEmitter { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* check if the current enabled apps are compatible with the current |
|
|
|
* ownCloud version. disable them if not. |
|
|
|
* This is important if you upgrade ownCloud and have non ported 3rd |
|
|
|
* party apps installed. |
|
|
|
*/ |
|
|
|
private function checkAppsRequirements() { |
|
|
|
$apps = OC_App::getEnabledApps(); |
|
|
|
$version = OC_Util::getVersion(); |
|
|
|
foreach ($apps as $app) { |
|
|
|
// check if the app is compatible with this version of ownCloud |
|
|
|
$info = OC_App::getAppInfo($app); |
|
|
|
if(!OC_App::isAppCompatible($version, $info)) { |
|
|
|
OC_App::disable($app); |
|
|
|
$this->emit('\OC\Updater', 'incompatibleAppDisabled', array($app)); |
|
|
|
} |
|
|
|
if (!OC_App::isShipped($app)) { |
|
|
|
\OC_App::disable($app); |
|
|
|
$this->emit('\OC\Updater', 'thirdPartyAppDisabled', array($app)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|