Merge pull request #1079 from owncloud/update-progress
Updater progress feedback
This commit is contained in:
commit
da7a14e9a6
|
@ -115,6 +115,9 @@ $CONFIG = array(
|
||||||
*/
|
*/
|
||||||
// "datadirectory" => "",
|
// "datadirectory" => "",
|
||||||
|
|
||||||
|
/* Enable maintenance mode to disable ownCloud */
|
||||||
|
"maintenance" => false,
|
||||||
|
|
||||||
"apps_paths" => array(
|
"apps_paths" => array(
|
||||||
|
|
||||||
/* Set an array of path for your apps directories
|
/* Set an array of path for your apps directories
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
set_time_limit(0);
|
||||||
|
$RUNTIME_NOAPPS = true;
|
||||||
|
require_once '../../lib/base.php';
|
||||||
|
|
||||||
|
if (OC::checkUpgrade(false)) {
|
||||||
|
$updateEventSource = new OC_EventSource();
|
||||||
|
$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');
|
||||||
|
try {
|
||||||
|
$result = OC_DB::updateDbFromStructure(OC::$SERVERROOT.'/db_structure.xml');
|
||||||
|
$watcher->success('Updated database');
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
$watcher->failure($exception->getMessage());
|
||||||
|
}
|
||||||
|
$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);
|
||||||
|
$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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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 { list-style:none; float:right; display:inline; margin:.7em 13em 0 0; }
|
||||||
.pager li { display:inline-block; }
|
.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; }
|
.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;}
|
.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; }
|
.separator { display:inline; border-left:1px solid #d3d3d3; border-right:1px solid #fff; height:10px; width:0px; margin:4px; }
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<ul>
|
||||||
|
<li class='update'>
|
||||||
|
<?php echo $l->t('Updating ownCloud to version %s, this may take a while.', array($_['version'])); ?><br /><br />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
OC.EventSource.requesttoken = oc_requesttoken;
|
||||||
|
var updateEventSource = new OC.EventSource(OC.webroot+'/core/ajax/update.php');
|
||||||
|
updateEventSource.listen('success', function(message) {
|
||||||
|
$('<span>').append(message).append('<br />').appendTo($('.update'));
|
||||||
|
});
|
||||||
|
updateEventSource.listen('error', function(message) {
|
||||||
|
$('<span>').addClass('error').append(message).append('<br />').appendTo($('.update'));
|
||||||
|
});
|
||||||
|
updateEventSource.listen('failure', function(message) {
|
||||||
|
$('<span>').addClass('error').append(message).append('<br />').appendTo($('.update'));
|
||||||
|
$('<span>')
|
||||||
|
.addClass('error bold')
|
||||||
|
.append('<br />')
|
||||||
|
.append(t('core', 'The update was unsuccessful. Please report this issue to the <a href="https://github.com/owncloud/core/issues" target="_blank">ownCloud community</a>.'))
|
||||||
|
.appendTo($('.update'));
|
||||||
|
});
|
||||||
|
updateEventSource.listen('done', function(message) {
|
||||||
|
$('<span>').addClass('bold').append('<br />').append(t('core', 'The update was successful. Redirecting you to ownCloud now.')).appendTo($('.update'));
|
||||||
|
setTimeout(function () {
|
||||||
|
window.location.href = OC.webroot;
|
||||||
|
}, 3000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -648,12 +648,15 @@ class OC_App{
|
||||||
if ($currentVersion) {
|
if ($currentVersion) {
|
||||||
$installedVersion = $versions[$app];
|
$installedVersion = $versions[$app];
|
||||||
if (version_compare($currentVersion, $installedVersion, '>')) {
|
if (version_compare($currentVersion, $installedVersion, '>')) {
|
||||||
|
$info = self::getAppInfo($app);
|
||||||
OC_Log::write($app, 'starting app upgrade from '.$installedVersion.' to '.$currentVersion, OC_Log::DEBUG);
|
OC_Log::write($app, 'starting app upgrade from '.$installedVersion.' to '.$currentVersion, OC_Log::DEBUG);
|
||||||
try {
|
try {
|
||||||
OC_App::updateApp($app);
|
OC_App::updateApp($app);
|
||||||
|
OC_Hook::emit('update', 'success', 'Updated '.$info['name'].' app');
|
||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"';
|
echo 'Failed to upgrade "'.$app.'". Exception="'.$e->getMessage().'"';
|
||||||
|
OC_Hook::emit('update', 'failure', 'Failed to update '.$info['name'].' app: '.$e->getMessage());
|
||||||
die;
|
die;
|
||||||
}
|
}
|
||||||
OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app));
|
OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app));
|
||||||
|
@ -678,6 +681,7 @@ class OC_App{
|
||||||
if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) {
|
if(!isset($info['require']) or (($version[0].'.'.$version[1])>$info['require'])) {
|
||||||
OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is not compatible with this version of ownCloud', OC_Log::ERROR);
|
OC_Log::write('core', 'App "'.$info['name'].'" ('.$app.') can\'t be used because it is not compatible with this version of ownCloud', OC_Log::ERROR);
|
||||||
OC_App::disable( $app );
|
OC_App::disable( $app );
|
||||||
|
OC_Hook::emit('update', 'success', 'Disabled '.$info['name'].' app because it is not compatible');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
68
lib/base.php
68
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()
|
public static function checkInstalled()
|
||||||
{
|
{
|
||||||
// Redirect to installer if not installed
|
// Redirect to installer if not installed
|
||||||
|
@ -219,41 +228,33 @@ class OC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function checkUpgrade()
|
public static function checkMaintenanceMode() {
|
||||||
{
|
// 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function checkUpgrade($showTemplate = true) {
|
||||||
if (OC_Config::getValue('installed', false)) {
|
if (OC_Config::getValue('installed', false)) {
|
||||||
$installedVersion = OC_Config::getValue('version', '0.0.0');
|
$installedVersion = OC_Config::getValue('version', '0.0.0');
|
||||||
$currentVersion = implode('.', OC_Util::getVersion());
|
$currentVersion = implode('.', OC_Util::getVersion());
|
||||||
if (version_compare($currentVersion, $installedVersion, '>')) {
|
if (version_compare($currentVersion, $installedVersion, '>')) {
|
||||||
// Check if the .htaccess is existing - this is needed for upgrades from really old ownCloud versions
|
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
|
||||||
if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) {
|
OC_Config::setValue('maintenance', true);
|
||||||
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);
|
OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG);
|
||||||
$result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml');
|
$tmpl = new OC_Template('', 'update', 'guest');
|
||||||
if (!$result) {
|
$tmpl->assign('version', OC_Util::getVersionString());
|
||||||
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();
|
$tmpl->printPage();
|
||||||
exit;
|
exit();
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
$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();
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,12 +274,6 @@ class OC
|
||||||
OC_Util::addScript('search', 'result');
|
OC_Util::addScript('search', 'result');
|
||||||
OC_Util::addScript('router');
|
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("styles");
|
||||||
OC_Util::addStyle("multiselect");
|
OC_Util::addStyle("multiselect");
|
||||||
OC_Util::addStyle("jquery-ui-1.8.16.custom");
|
OC_Util::addStyle("jquery-ui-1.8.16.custom");
|
||||||
|
@ -403,10 +398,12 @@ class OC
|
||||||
stream_wrapper_register('static', 'OC_StaticStreamWrapper');
|
stream_wrapper_register('static', 'OC_StaticStreamWrapper');
|
||||||
stream_wrapper_register('close', 'OC_CloseStreamWrapper');
|
stream_wrapper_register('close', 'OC_CloseStreamWrapper');
|
||||||
|
|
||||||
|
self::checkConfig();
|
||||||
self::checkInstalled();
|
self::checkInstalled();
|
||||||
self::checkSSL();
|
self::checkSSL();
|
||||||
self::initSession();
|
self::initSession();
|
||||||
self::initTemplateEngine();
|
self::initTemplateEngine();
|
||||||
|
self::checkMaintenanceMode();
|
||||||
self::checkUpgrade();
|
self::checkUpgrade();
|
||||||
|
|
||||||
$errors = OC_Util::checkServer();
|
$errors = OC_Util::checkServer();
|
||||||
|
@ -482,6 +479,11 @@ class OC
|
||||||
if (OC_Util::issetlocaleworking() == false) {
|
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);
|
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_Config::getValue('installed', false)) {
|
||||||
|
if (OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax') == 'ajax') {
|
||||||
|
OC_Util::addScript('backgroundjobs');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
10
lib/db.php
10
lib/db.php
|
@ -495,8 +495,9 @@ class OC_DB {
|
||||||
if (PEAR::isError($previousSchema)) {
|
if (PEAR::isError($previousSchema)) {
|
||||||
$error = $previousSchema->getMessage();
|
$error = $previousSchema->getMessage();
|
||||||
$detail = $previousSchema->getDebugInfo();
|
$detail = $previousSchema->getDebugInfo();
|
||||||
OC_Log::write('core', 'Failed to get existing database structure for upgrading ('.$error.', '.$detail.')', OC_Log::FATAL);
|
$message = 'Failed to get existing database structure for updating ('.$error.', '.$detail.')';
|
||||||
return false;
|
OC_Log::write('core', $message, OC_Log::FATAL);
|
||||||
|
throw new Exception($message);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make changes and save them to an in-memory file
|
// Make changes and save them to an in-memory file
|
||||||
|
@ -523,8 +524,9 @@ class OC_DB {
|
||||||
if (PEAR::isError($op)) {
|
if (PEAR::isError($op)) {
|
||||||
$error = $op->getMessage();
|
$error = $op->getMessage();
|
||||||
$detail = $op->getDebugInfo();
|
$detail = $op->getDebugInfo();
|
||||||
OC_Log::write('core', 'Failed to update database structure ('.$error.', '.$detail.')', OC_Log::FATAL);
|
$message = 'Failed to update database structure ('.$error.', '.$detail.')';
|
||||||
return false;
|
OC_Log::write('core', $message, OC_Log::FATAL);
|
||||||
|
throw new Exception($message);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue