From 58f473d734373047db585d3b2926d33aa326f5ab Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 6 Jul 2013 17:00:00 +0200 Subject: split upgrade logic from ajax file --- lib/legacy/updater.php | 14 +++++ lib/updater.php | 157 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 132 insertions(+), 39 deletions(-) create mode 100644 lib/legacy/updater.php (limited to 'lib') diff --git a/lib/legacy/updater.php b/lib/legacy/updater.php new file mode 100644 index 00000000000..8a769a2f14b --- /dev/null +++ b/lib/legacy/updater.php @@ -0,0 +1,14 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Updater { + public static function check() { + $updater = new \OC\Updater(); + return $updater->check(); + } +} diff --git a/lib/updater.php b/lib/updater.php index 9081bfc4be8..6baf346a8e0 100644 --- a/lib/updater.php +++ b/lib/updater.php @@ -1,56 +1,67 @@ . - * + * Copyright (c) 2013 Robin Appelman + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. */ +namespace OC; +use OC\Hooks\BasicEmitter; + /** * Class that handels autoupdating of ownCloud + * + * Hooks provided in scope \OC\Updater + * - maintenanceStart() + * - maintenanceEnd() + * - dbUpgrade() + * - filecacheStart() + * - filecacheProgress(int $percentage) + * - filecacheDone() + * - failure(string $message) */ -class OC_Updater{ +class Updater extends BasicEmitter { + + /** + * @var \OC\Log $log + */ + private $log; + + /** + * @param \OC\Log $log + */ + public function __construct($log = null) { + $this->log = $log; + } /** * Check if a new version is available + * @return array | bool */ - public static function check() { + public function check() { // Look up the cache - it is invalidated all 30 minutes - if((OC_Appconfig::getValue('core', 'lastupdatedat') + 1800) > time()) { - return json_decode(OC_Appconfig::getValue('core', 'lastupdateResult'), true); + if ((\OC_Appconfig::getValue('core', 'lastupdatedat') + 1800) > time()) { + return json_decode(\OC_Appconfig::getValue('core', 'lastupdateResult'), true); } - OC_Appconfig::setValue('core', 'lastupdatedat', time()); + \OC_Appconfig::setValue('core', 'lastupdatedat', time()); - if(OC_Appconfig::getValue('core', 'installedat', '')=='') { - OC_Appconfig::setValue('core', 'installedat', microtime(true)); + if (\OC_Appconfig::getValue('core', 'installedat', '') == '') { + \OC_Appconfig::setValue('core', 'installedat', microtime(true)); } - $updaterurl='http://apps.owncloud.com/updater.php'; - $version=OC_Util::getVersion(); - $version['installed']=OC_Appconfig::getValue('core', 'installedat'); - $version['updated']=OC_Appconfig::getValue('core', 'lastupdatedat'); - $version['updatechannel']='stable'; - $version['edition']=OC_Util::getEditionString(); - $versionstring=implode('x', $version); + $updaterurl = 'http://apps.owncloud.com/updater.php'; + $version = \OC_Util::getVersion(); + $version['installed'] = \OC_Appconfig::getValue('core', 'installedat'); + $version['updated'] = \OC_Appconfig::getValue('core', 'lastupdatedat'); + $version['updatechannel'] = 'stable'; + $version['edition'] = \OC_Util::getEditionString(); + $versionstring = implode('x', $version); //fetch xml data from updater - $url=$updaterurl.'?version='.$versionstring; + $url = $updaterurl . '?version=' . $versionstring; // set a sensible timeout of 10 sec to stay responsive even if the update server is down. $ctx = stream_context_create( @@ -60,21 +71,89 @@ class OC_Updater{ ) ) ); - $xml=@file_get_contents($url, 0, $ctx); - if($xml==false) { + $xml = @file_get_contents($url, 0, $ctx); + if ($xml == false) { return array(); } - $data=@simplexml_load_string($xml); + $data = @simplexml_load_string($xml); - $tmp=array(); + $tmp = array(); $tmp['version'] = $data->version; $tmp['versionstring'] = $data->versionstring; $tmp['url'] = $data->url; $tmp['web'] = $data->web; // Cache the result - OC_Appconfig::setValue('core', 'lastupdateResult', json_encode($data)); + \OC_Appconfig::setValue('core', 'lastupdateResult', json_encode($data)); return $tmp; } -} \ No newline at end of file + + /** + * runs the update actions in maintenance mode, does not upgrade the source files + */ + public function upgrade() { + \OC_DB::enableCaching(false); + \OC_Config::setValue('maintenance', true); + $installedVersion = \OC_Config::getValue('version', '0.0.0'); + $currentVersion = implode('.', \OC_Util::getVersion()); + if ($this->log) { + $this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core')); + } + $this->emit('\OC\Updater', 'maintenanceStart'); + try { + \OC_DB::updateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml'); + $this->emit('\OC\Updater', 'dbUpgrade'); + + // do a file cache upgrade for users with files + // this can take loooooooooooooooooooooooong + $this->upgradeFileCache(); + } catch (\Exception $exception) { + $this->emit('\OC\Updater', 'failure', array($exception->getMessage())); + } + \OC_Config::setValue('version', implode('.', \OC_Util::getVersion())); + \OC_App::checkAppsRequirements(); + // load all apps to also upgrade enabled apps + \OC_App::loadApps(); + \OC_Config::setValue('maintenance', false); + $this->emit('\OC\Updater', 'maintenanceEnd'); + } + + private function upgradeFileCache() { + try { + $query = \OC_DB::prepare(' + SELECT DISTINCT `user` + FROM `*PREFIX*fscache` + '); + $result = $query->execute(); + } catch (\Exception $e) { + return; + } + $users = $result->fetchAll(); + if (count($users) == 0) { + return; + } + $step = 100 / count($users); + $percentCompleted = 0; + $lastPercentCompletedOutput = 0; + $startInfoShown = false; + foreach ($users as $userRow) { + $user = $userRow['user']; + \OC\Files\Filesystem::initMountPoints($user); + \OC\Files\Cache\Upgrade::doSilentUpgrade($user); + if (!$startInfoShown) { + //We show it only now, because otherwise Info about upgraded apps + //will appear between this and progress info + $this->emit('\OC\Updater', 'filecacheStart'); + $startInfoShown = true; + } + $percentCompleted += $step; + $out = floor($percentCompleted); + if ($out != $lastPercentCompletedOutput) { + $this->emit('\OC\Updater', 'filecacheProgress', array($out)); + $lastPercentCompletedOutput = $out; + } + } + $this->emit('\OC\Updater', 'filecacheDone'); + } +} -- cgit v1.2.3 From 9cd7ecd5022ea799a18f58c890b2292b4e1e3c77 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 6 Jul 2013 17:05:38 +0200 Subject: Updater: pass update url as argument to update check --- lib/legacy/updater.php | 2 +- lib/updater.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/legacy/updater.php b/lib/legacy/updater.php index 8a769a2f14b..eea7bb129cf 100644 --- a/lib/legacy/updater.php +++ b/lib/legacy/updater.php @@ -9,6 +9,6 @@ class OC_Updater { public static function check() { $updater = new \OC\Updater(); - return $updater->check(); + return $updater->check('http://apps.owncloud.com/updater.php'); } } diff --git a/lib/updater.php b/lib/updater.php index 6baf346a8e0..5a9f499f91b 100644 --- a/lib/updater.php +++ b/lib/updater.php @@ -37,9 +37,10 @@ class Updater extends BasicEmitter { /** * Check if a new version is available + * @param string $updateUrl the url to check, i.e. 'http://apps.owncloud.com/updater.php' * @return array | bool */ - public function check() { + public function check($updaterUrl) { // Look up the cache - it is invalidated all 30 minutes if ((\OC_Appconfig::getValue('core', 'lastupdatedat') + 1800) > time()) { @@ -51,17 +52,16 @@ class Updater extends BasicEmitter { if (\OC_Appconfig::getValue('core', 'installedat', '') == '') { \OC_Appconfig::setValue('core', 'installedat', microtime(true)); } - - $updaterurl = 'http://apps.owncloud.com/updater.php'; +; $version = \OC_Util::getVersion(); $version['installed'] = \OC_Appconfig::getValue('core', 'installedat'); $version['updated'] = \OC_Appconfig::getValue('core', 'lastupdatedat'); $version['updatechannel'] = 'stable'; $version['edition'] = \OC_Util::getEditionString(); - $versionstring = implode('x', $version); + $versionString = implode('x', $version); //fetch xml data from updater - $url = $updaterurl . '?version=' . $versionstring; + $url = $updaterUrl . '?version=' . $versionString; // set a sensible timeout of 10 sec to stay responsive even if the update server is down. $ctx = stream_context_create( -- cgit v1.2.3 From a0d5ba116750bf78ca349ec1f3c9560aa12c3261 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 8 Jul 2013 21:13:23 +0200 Subject: fix typo --- lib/updater.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/updater.php b/lib/updater.php index 5a9f499f91b..df7332a96a9 100644 --- a/lib/updater.php +++ b/lib/updater.php @@ -10,7 +10,7 @@ namespace OC; use OC\Hooks\BasicEmitter; /** - * Class that handels autoupdating of ownCloud + * Class that handles autoupdating of ownCloud * * Hooks provided in scope \OC\Updater * - maintenanceStart() @@ -52,7 +52,7 @@ class Updater extends BasicEmitter { if (\OC_Appconfig::getValue('core', 'installedat', '') == '') { \OC_Appconfig::setValue('core', 'installedat', microtime(true)); } -; + $version = \OC_Util::getVersion(); $version['installed'] = \OC_Appconfig::getValue('core', 'installedat'); $version['updated'] = \OC_Appconfig::getValue('core', 'lastupdatedat'); -- cgit v1.2.3