Blame view
sources/lib/updater.php
4.96 KB
|
03e52840d
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
use OC\Hooks\BasicEmitter;
/**
* Class that handles autoupdating of ownCloud
*
* Hooks provided in scope \OC\Updater
* - maintenanceStart()
* - maintenanceEnd()
* - dbUpgrade()
* - filecacheStart()
* - filecacheProgress(int $percentage)
* - filecacheDone()
* - failure(string $message)
*/
class OC_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
*/
static public function check($updaterUrl='http://apps.owncloud.com/updater.php') {
if ((\OC_Appconfig::getValue('core', 'lastupdatedat') + 1800) > time()) {
return json_decode(\OC_Appconfig::getValue('core', 'lastupdateResult'), true);
}
\OC_Appconfig::setValue('core', 'lastupdatedat', time());
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');
$version['updatechannel'] = 'stable';
$version['edition'] = \OC_Util::getEditionString();
$versionString = implode('x', $version);
//fetch xml data from updater
$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(
array(
'http' => array(
'timeout' => 10
)
)
);
$xml = @file_get_contents($url, 0, $ctx);
if ($xml == false) {
return array();
}
$data = @simplexml_load_string($xml);
$tmp = array();
$tmp['version'] = $data->version;
$tmp['versionstring'] = $data->versionstring;
$tmp['url'] = $data->url;
$tmp['web'] = $data->web;
\OC_Appconfig::setValue('core', 'lastupdateResult', json_encode($data));
return $tmp;
}
public static function ShowUpdatingHint() {
$l = OC_L10N::get('lib');
if(OC_Config::getValue('updatechecker', true)==true) {
$data=OC_Updater::check();
if(isset($data['version']) && !empty($data['version'])) {
$txt='<span style="color:#AA0000; font-weight:bold;">'
.$l->t('%s is available. Get <a href="%s">more information</a>',
array($data['versionstring'], $data['web'])).'</span>';
}else{
$txt=$l->t('up to date');
}
} else {
$txt=$l->t('updates check is disabled');
}
return($txt);
}
/**
* 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());
\OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, \OC_Log::WARN);
$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();
if(\OCP\DB::isError($result)) {
//MDB2 does not throw Exception by itself
throw new \Exception($result->getMessage());
}
} catch (\Exception $e) {
//No such table, i.e. filecache upgrade already proceeded
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');
}
}
|