From a52aa69ffe5f6d00de7855c9a376f347c03b99f7 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Thu, 3 Jan 2013 14:11:00 -0500 Subject: [PATCH 01/10] Rearrange code to prepare for updater feedback --- lib/base.php | 100 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 37 deletions(-) diff --git a/lib/base.php b/lib/base.php index ef203b33c2..eaef984df3 100644 --- a/lib/base.php +++ b/lib/base.php @@ -193,6 +193,15 @@ class OC ); } + public static function checkConfig() { + if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) { + $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); + $tmpl->printPage(); + exit(); + } + } + public static function checkInstalled() { // Redirect to installer if not installed @@ -219,43 +228,58 @@ class OC } } - public static function checkUpgrade() - { - if (OC_Config::getValue('installed', false)) { - $installedVersion = OC_Config::getValue('version', '0.0.0'); - $currentVersion = implode('.', OC_Util::getVersion()); - if (version_compare($currentVersion, $installedVersion, '>')) { - // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions - if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { - if (!OC_Util::ishtaccessworking()) { - if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) { - OC_Setup::protectDataDirectory(); - } - } - } - OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); - $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml'); - if (!$result) { - echo 'Error while upgrading the database'; - die(); - } - if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) { - $tmpl = new OC_Template('', 'error', 'guest'); - $tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud"))); - $tmpl->printPage(); - exit; - } - $minimizerCSS = new OC_Minimizer_CSS(); - $minimizerCSS->clearCache(); - $minimizerJS = new OC_Minimizer_JS(); - $minimizerJS->clearCache(); - OC_Config::setValue('version', implode('.', OC_Util::getVersion())); - OC_App::checkAppsRequirements(); - // load all apps to also upgrade enabled apps - OC_App::loadApps(); - } - } - } + public static function checkMaintenanceMode() { + if (OC_Config::getValue('maintenance', false)) { + $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->printPage(); + exit(); + } + } + + public static function checkUpgrade($showTemplate = true) { + if (OC_Config::getValue('installed', false)) { + $installedVersion = OC_Config::getValue('version', '0.0.0'); + $currentVersion = implode('.', OC_Util::getVersion()); + if (version_compare($currentVersion, $installedVersion, '>')) { + if ($showTemplate) { + OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); + $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->printPage(); + exit(); + } else { + return true; + } + } + return false; + } + } + + public static function doUpgrade() { + if (self::checkUpgrade(false)) { + OC_Config::setValue('maintenance', true); + // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions + if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { + if (!OC_Util::ishtaccessworking()) { + if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) { + OC_Setup::protectDataDirectory(); + } + } + } + $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml'); + if (!$result) { + echo 'Error while upgrading the database'; + die(); + } + $minimizerCSS = new OC_Minimizer_CSS(); + $minimizerCSS->clearCache(); + $minimizerJS = new OC_Minimizer_JS(); + $minimizerJS->clearCache(); + OC_Config::setValue('version', implode('.', OC_Util::getVersion())); + OC_App::checkAppsRequirements(); + // load all apps to also upgrade enabled apps + OC_App::loadApps(); + } + } public static function initTemplateEngine() { @@ -403,10 +427,12 @@ class OC stream_wrapper_register('static', 'OC_StaticStreamWrapper'); stream_wrapper_register('close', 'OC_CloseStreamWrapper'); + self::checkConfig(); self::checkInstalled(); self::checkSSL(); self::initSession(); self::initTemplateEngine(); + self::checkMaintenanceMode(); self::checkUpgrade(); $errors = OC_Util::checkServer(); From 75058370795fda4f06f589ee970edf94dc0ddf88 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Thu, 3 Jan 2013 21:32:33 -0500 Subject: [PATCH 02/10] Basic update progress of database update only --- core/ajax/update.php | 36 ++++++++++++++++++++++++++++ core/css/styles.css | 3 ++- core/templates/update.php | 27 +++++++++++++++++++++ lib/base.php | 49 ++++++++++----------------------------- 4 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 core/ajax/update.php create mode 100644 core/templates/update.php diff --git a/core/ajax/update.php b/core/ajax/update.php new file mode 100644 index 0000000000..6f5398f41c --- /dev/null +++ b/core/ajax/update.php @@ -0,0 +1,36 @@ +send('success', 'Turned on maintenance mode'); + // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions + if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { + if (!OC_Util::ishtaccessworking()) { + if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) { + OC_Setup::protectDataDirectory(); + } + } + } + $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml'); + if (!$result) { + $updateEventSource->send('failure', 'Error updating database'); + $updateEventSource->close(); + die(); + } + $updateEventSource->send('success', 'Updated database'); + $minimizerCSS = new OC_Minimizer_CSS(); + $minimizerCSS->clearCache(); + $minimizerJS = new OC_Minimizer_JS(); + $minimizerJS->clearCache(); + 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); + $updateEventSource->send('success', 'Turned off maintenance mode'); + $updateEventSource->send('done', 'done'); + $updateEventSource->close(); +} \ No newline at end of file diff --git a/core/css/styles.css b/core/css/styles.css index d635916b5a..6e1cef72ed 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -214,7 +214,8 @@ div.jp-play-bar, div.jp-seek-bar { padding:0; } .pager { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; } .pager li { display:inline-block; } -li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; color:#FF3B3B; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } +li.update, li.error { width:640px; margin:4em auto; padding:1em 1em 1em 4em; background:#ffe .8em .8em no-repeat; border:1px solid #ccc; -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; cursor:default; } +.error { color:#FF3B3B; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { overflow:hidden; text-overflow:ellipsis; } .hint { background-image:url('../img/actions/info.png'); background-repeat:no-repeat; color:#777777; padding-left:25px; background-position:0 0.3em;} .separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; } diff --git a/core/templates/update.php b/core/templates/update.php new file mode 100644 index 0000000000..cf3f2ab0d7 --- /dev/null +++ b/core/templates/update.php @@ -0,0 +1,27 @@ + + \ No newline at end of file diff --git a/lib/base.php b/lib/base.php index eaef984df3..ec08ccc67b 100644 --- a/lib/base.php +++ b/lib/base.php @@ -229,8 +229,10 @@ class OC } public static function checkMaintenanceMode() { - if (OC_Config::getValue('maintenance', false)) { + // Allow ajax update script to execute without being stopped + if (OC_Config::getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') { $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl->assign('errors', array(1 => array('error' => 'ownCloud is in maintenance mode'))); $tmpl->printPage(); exit(); } @@ -241,9 +243,12 @@ class OC $installedVersion = OC_Config::getValue('version', '0.0.0'); $currentVersion = implode('.', OC_Util::getVersion()); if (version_compare($currentVersion, $installedVersion, '>')) { - if ($showTemplate) { + if ($showTemplate && !OC_Config::getValue('maintenance', false)) { + OC_Config::setValue('maintenance', true); OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG); - $tmpl = new OC_Template('', 'error', 'guest'); + $tmpl = new OC_Template('', 'update', 'guest'); + $tmpl->assign('current', $currentVersion); + $tmpl->assign('installed', $installedVersion); $tmpl->printPage(); exit(); } else { @@ -254,33 +259,6 @@ class OC } } - public static function doUpgrade() { - if (self::checkUpgrade(false)) { - OC_Config::setValue('maintenance', true); - // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions - if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { - if (!OC_Util::ishtaccessworking()) { - if (!file_exists(OC::$SERVERROOT . '/data/.htaccess')) { - OC_Setup::protectDataDirectory(); - } - } - } - $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml'); - if (!$result) { - echo 'Error while upgrading the database'; - die(); - } - $minimizerCSS = new OC_Minimizer_CSS(); - $minimizerCSS->clearCache(); - $minimizerJS = new OC_Minimizer_JS(); - $minimizerJS->clearCache(); - OC_Config::setValue('version', implode('.', OC_Util::getVersion())); - OC_App::checkAppsRequirements(); - // load all apps to also upgrade enabled apps - OC_App::loadApps(); - } - } - public static function initTemplateEngine() { // Add the stuff we need always @@ -297,12 +275,6 @@ class OC OC_Util::addScript('search', 'result'); OC_Util::addScript('router'); - if (OC_Config::getValue('installed', false)) { - if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { - OC_Util::addScript('backgroundjobs'); - } - } - OC_Util::addStyle("styles"); OC_Util::addStyle("multiselect"); OC_Util::addStyle("jquery-ui-1.8.16.custom"); @@ -433,7 +405,7 @@ class OC self::initSession(); self::initTemplateEngine(); self::checkMaintenanceMode(); - self::checkUpgrade(); + self::checkUpgrade(); $errors = OC_Util::checkServer(); if (count($errors) > 0) { @@ -508,6 +480,9 @@ class OC if (OC_Util::issetlocaleworking() == false) { OC_Log::write('core', 'setting locate to en_US.UTF-8 failed. Support is probably not installed on your system', OC_Log::ERROR); } + if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { + OC_Util::addScript('backgroundjobs'); + } } /** From e7eea3dd2e3eb0f5bd77901167656275d835cfb3 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 4 Jan 2013 10:21:33 -0500 Subject: [PATCH 03/10] Use hooks to send updates from apps --- core/ajax/update.php | 54 +++++++++++++++++++++++++++++++++++++------- lib/app.php | 1 + 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/core/ajax/update.php b/core/ajax/update.php index 6f5398f41c..0d58f17f09 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -5,7 +5,11 @@ require_once '../../lib/base.php'; if (OC::checkUpgrade(false)) { $updateEventSource = new OC_EventSource(); - $updateEventSource->send('success', 'Turned on maintenance mode'); + $watcher = new UpdateWatcher($updateEventSource); + OC_Hook::connect('update', 'success', $watcher, 'success'); + OC_Hook::connect('update', 'error', $watcher, 'error'); + OC_Hook::connect('update', 'error', $watcher, 'failure'); + $watcher->success('Turned on maintenance mode'); // Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) { if (!OC_Util::ishtaccessworking()) { @@ -16,11 +20,9 @@ if (OC::checkUpgrade(false)) { } $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml'); if (!$result) { - $updateEventSource->send('failure', 'Error updating database'); - $updateEventSource->close(); - die(); + $watcher->failure('Error updating database'); } - $updateEventSource->send('success', 'Updated database'); + $watcher->success('Updated database'); $minimizerCSS = new OC_Minimizer_CSS(); $minimizerCSS->clearCache(); $minimizerJS = new OC_Minimizer_JS(); @@ -30,7 +32,43 @@ if (OC::checkUpgrade(false)) { // load all apps to also upgrade enabled apps OC_App::loadApps(); OC_Config::setValue('maintenance', false); - $updateEventSource->send('success', 'Turned off maintenance mode'); - $updateEventSource->send('done', 'done'); - $updateEventSource->close(); + $watcher->success('Turned off maintenance mode'); + $watcher->done(); +} + +class UpdateWatcher { + /** + * @var \OC_EventSource $eventSource; + */ + private $eventSource; + + public function __construct($eventSource) { + $this->eventSource = $eventSource; + } + + public function success($message) { + OC_Util::obEnd(); + $this->eventSource->send('success', $message); + ob_start(); + } + + public function error($message) { + OC_Util::obEnd(); + $this->eventSource->send('error', $message); + ob_start(); + } + + public function failure($message) { + OC_Util::obEnd(); + $this->eventSource->send('failure', $message); + $this->eventSource->close(); + die(); + } + + public function done() { + OC_Util::obEnd(); + $this->eventSource->send('done', ''); + $this->eventSource->close(); + } + } \ No newline at end of file diff --git a/lib/app.php b/lib/app.php index be6d5ab3dd..596f3bf3a7 100755 --- a/lib/app.php +++ b/lib/app.php @@ -642,6 +642,7 @@ class OC_App{ echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"'; die; } + OC_Hook::emit('update', 'success', 'Updated '.$app.' app'); OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app)); } } From ceafb5d7d1bd77b2e0b5ac7bb71178d3ba0be1c1 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 4 Jan 2013 10:31:59 -0500 Subject: [PATCH 04/10] Add maintenance mode entry to config.sample.php --- config/config.sample.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/config.sample.php b/config/config.sample.php index 2eec7847f9..b1655d0283 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -115,6 +115,9 @@ $CONFIG = array( */ // "datadirectory" => "", +/* Enable maintenance mode to disable ownCloud */ +"maintenance" => false, + "apps_paths" => array( /* Set an array of path for your apps directories From f2e6df807d05ef50b28ca2afc9ea51970ec0d87b Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 4 Jan 2013 14:16:59 -0500 Subject: [PATCH 05/10] Add back check if installed around background jobs --- lib/base.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/base.php b/lib/base.php index ec08ccc67b..e6355013c7 100644 --- a/lib/base.php +++ b/lib/base.php @@ -480,8 +480,10 @@ class OC if (OC_Util::issetlocaleworking() == false) { OC_Log::write('core', 'setting locate to en_US.UTF-8 failed. Support is probably not installed on your system', OC_Log::ERROR); } - if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { - OC_Util::addScript('backgroundjobs'); + if (OC_Config::getValue('installed', false)) { + if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') { + OC_Util::addScript('backgroundjobs'); + } } } From a94405b4e4ebbeea2f8bc3a220572dab1ae7cb3a Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Fri, 4 Jan 2013 20:13:00 -0500 Subject: [PATCH 06/10] Only show the version updating to instead of worrying about converting internal to a formatted version --- core/templates/update.php | 2 +- lib/base.php | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/templates/update.php b/core/templates/update.php index cf3f2ab0d7..41da712c6c 100644 --- a/core/templates/update.php +++ b/core/templates/update.php @@ -1,6 +1,6 @@
  • - t('Updating ownCloud from version %s to version %s, this may take a while.', array($_['installed'], $_['current'])); ?>

    + t('Updating ownCloud to version %s, this may take a while.', array($_['version'])); ?>