summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorThomas Müller <DeepDiver1975@users.noreply.github.com>2016-05-02 17:50:29 +0200
committerThomas Müller <DeepDiver1975@users.noreply.github.com>2016-05-02 17:50:29 +0200
commit05cf552f6686adf52ccabe0ccaf6898eb72936e0 (patch)
tree1e449a23d3f16354997c8f19e9bf12689da6a285 /lib/private
parentb84825f0301fb073bfcc6e05132675d104afcfe3 (diff)
parent5e055ca6c1837a762aed7fe1e09b3a834fd50f20 (diff)
downloadnextcloud-server-05cf552f6686adf52ccabe0ccaf6898eb72936e0.tar.gz
nextcloud-server-05cf552f6686adf52ccabe0ccaf6898eb72936e0.zip
Merge pull request #24322 from owncloud/install-and-uninstall-repair-steps
Adding repair steps for install and uninstall
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/App/InfoParser.php12
-rw-r--r--lib/private/Installer.php (renamed from lib/private/legacy/installer.php)86
-rw-r--r--lib/private/Repair.php11
-rw-r--r--lib/private/Setup.php2
-rw-r--r--lib/private/Updater.php7
-rw-r--r--lib/private/legacy/app.php27
6 files changed, 69 insertions, 76 deletions
diff --git a/lib/private/App/InfoParser.php b/lib/private/App/InfoParser.php
index b7540c04248..21422d40603 100644
--- a/lib/private/App/InfoParser.php
+++ b/lib/private/App/InfoParser.php
@@ -74,6 +74,9 @@ class InfoParser {
if (!array_key_exists('repair-steps', $array)) {
$array['repair-steps'] = [];
}
+ if (!array_key_exists('install', $array['repair-steps'])) {
+ $array['repair-steps']['install'] = [];
+ }
if (!array_key_exists('pre-migration', $array['repair-steps'])) {
$array['repair-steps']['pre-migration'] = [];
}
@@ -83,6 +86,9 @@ class InfoParser {
if (!array_key_exists('live-migration', $array['repair-steps'])) {
$array['repair-steps']['live-migration'] = [];
}
+ if (!array_key_exists('uninstall', $array['repair-steps'])) {
+ $array['repair-steps']['uninstall'] = [];
+ }
if (array_key_exists('documentation', $array) && is_array($array['documentation'])) {
foreach ($array['documentation'] as $key => $url) {
@@ -107,6 +113,9 @@ class InfoParser {
$array['types'] = [];
}
}
+ if (isset($array['repair-steps']['install']['step']) && is_array($array['repair-steps']['install']['step'])) {
+ $array['repair-steps']['install'] = $array['repair-steps']['install']['step'];
+ }
if (isset($array['repair-steps']['pre-migration']['step']) && is_array($array['repair-steps']['pre-migration']['step'])) {
$array['repair-steps']['pre-migration'] = $array['repair-steps']['pre-migration']['step'];
}
@@ -116,6 +125,9 @@ class InfoParser {
if (isset($array['repair-steps']['live-migration']['step']) && is_array($array['repair-steps']['live-migration']['step'])) {
$array['repair-steps']['live-migration'] = $array['repair-steps']['live-migration']['step'];
}
+ if (isset($array['repair-steps']['uninstall']['step']) && is_array($array['repair-steps']['uninstall']['step'])) {
+ $array['repair-steps']['uninstall'] = $array['repair-steps']['uninstall']['step'];
+ }
return $array;
}
diff --git a/lib/private/legacy/installer.php b/lib/private/Installer.php
index 24c79b2dd8c..643590ae22e 100644
--- a/lib/private/legacy/installer.php
+++ b/lib/private/Installer.php
@@ -37,15 +37,19 @@
*
*/
+namespace OC;
+
use OC\App\CodeChecker\CodeChecker;
use OC\App\CodeChecker\EmptyCheck;
use OC\App\CodeChecker\PrivateCheck;
-use OC\OCSClient;
+use OC_App;
+use OC_DB;
+use OC_Helper;
/**
* This class provides the functionality needed to install, update and remove plugins/apps
*/
-class OC_Installer{
+class Installer {
/**
*
@@ -134,16 +138,19 @@ class OC_Installer{
self::includeAppScript($basedir . '/appinfo/install.php');
}
+ $appData = OC_App::getAppInfo($appId);
+ OC_App::executeRepairSteps($appId, $appData['repair-steps']['install']);
+
//set the installed version
- \OC::$server->getAppConfig()->setValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id']));
- \OC::$server->getAppConfig()->setValue($info['id'], 'enabled', 'no');
+ \OC::$server->getConfig()->setAppValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id']));
+ \OC::$server->getConfig()->setAppValue($info['id'], 'enabled', 'no');
- //set remote/public handelers
+ //set remote/public handlers
foreach($info['remote'] as $name=>$path) {
- OCP\CONFIG::setAppValue('core', 'remote_'.$name, $info['id'].'/'.$path);
+ \OC::$server->getConfig()->setAppValue('core', 'remote_'.$name, $info['id'].'/'.$path);
}
foreach($info['public'] as $name=>$path) {
- OCP\CONFIG::setAppValue('core', 'public_'.$name, $info['id'].'/'.$path);
+ \OC::$server->getConfig()->setAppValue('core', 'public_'.$name, $info['id'].'/'.$path);
}
OC_App::setAppTypes($info['id']);
@@ -158,15 +165,15 @@ class OC_Installer{
*
* Checks whether or not an app is installed, i.e. registered in apps table.
*/
- public static function isInstalled( $app ) {
- return (\OC::$server->getAppConfig()->getValue($app, "installed_version") !== null);
+ public static function isInstalled( $app ) {
+ return (\OC::$server->getConfig()->getAppValue($app, "installed_version", null) !== null);
}
/**
* @brief Update an application
* @param array $info
* @param bool $isShipped
- * @throws Exception
+ * @throws \Exception
* @return bool
*
* This function could work like described below, but currently it disables and then
@@ -229,7 +236,7 @@ class OC_Installer{
*
* @param integer $ocsId
* @return bool
- * @throws Exception
+ * @throws \Exception
*/
public static function updateAppByOCSId($ocsId) {
$ocsClient = new OCSClient(
@@ -257,7 +264,7 @@ class OC_Installer{
/**
* @param array $data
* @return array
- * @throws Exception
+ * @throws \Exception
*/
public static function downloadApp($data = array()) {
$l = \OC::$server->getL10N('lib');
@@ -293,7 +300,7 @@ class OC_Installer{
$extractDir = \OC::$server->getTempManager()->getTemporaryFolder();
OC_Helper::rmdirr($extractDir);
mkdir($extractDir);
- if($archive=OC_Archive::open($path)) {
+ if($archive=\OC_Archive::open($path)) {
$archive->extract($extractDir);
} else {
OC_Helper::rmdirr($extractDir);
@@ -375,7 +382,7 @@ class OC_Installer{
}
// check the code for not allowed calls
- if(!$isShipped && !OC_Installer::checkCode($extractDir)) {
+ if(!$isShipped && !Installer::checkCode($extractDir)) {
OC_Helper::rmdirr($extractDir);
throw new \Exception($l->t("App can't be installed because of not allowed code in the App"));
}
@@ -457,7 +464,7 @@ class OC_Installer{
* The function will check if the app is already downloaded in the apps repository
*/
public static function isDownloaded( $name ) {
- foreach(OC::$APPSROOTS as $dir) {
+ foreach(\OC::$APPSROOTS as $dir) {
$dirToTest = $dir['path'];
$dirToTest .= '/';
$dirToTest .= $name;
@@ -474,52 +481,25 @@ class OC_Installer{
/**
* Removes an app
* @param string $name name of the application to remove
- * @param array $options options
* @return boolean
*
- * This function removes an app. $options is an associative array. The
- * following keys are optional:ja
- * - keeppreferences: boolean, if true the user preferences won't be deleted
- * - keepappconfig: boolean, if true the config will be kept
- * - keeptables: boolean, if true the database will be kept
- * - keepfiles: boolean, if true the user files will be kept
*
* This function works as follows
- * -# including appinfo/remove.php
+ * -# call uninstall repair steps
* -# removing the files
*
* The function will not delete preferences, tables and the configuration,
* this has to be done by the function oc_app_uninstall().
*/
- public static function removeApp( $name, $options = array()) {
+ public static function removeApp($appId) {
- if(isset($options['keeppreferences']) and $options['keeppreferences']==false ) {
- // todo
- // remove preferences
- }
-
- if(isset($options['keepappconfig']) and $options['keepappconfig']==false ) {
- // todo
- // remove app config
- }
-
- if(isset($options['keeptables']) and $options['keeptables']==false ) {
- // todo
- // remove app database tables
- }
-
- if(isset($options['keepfiles']) and $options['keepfiles']==false ) {
- // todo
- // remove user files
- }
-
- if(OC_Installer::isDownloaded( $name )) {
- $appdir=OC_App::getInstallPath().'/'.$name;
- OC_Helper::rmdirr($appdir);
+ if(Installer::isDownloaded( $appId )) {
+ $appDir=OC_App::getInstallPath() . '/' . $appId;
+ OC_Helper::rmdirr($appDir);
return true;
}else{
- \OCP\Util::writeLog('core', 'can\'t remove app '.$name.'. It is not installed.', \OCP\Util::ERROR);
+ \OCP\Util::writeLog('core', 'can\'t remove app '.$appId.'. It is not installed.', \OCP\Util::ERROR);
return false;
}
@@ -536,25 +516,25 @@ class OC_Installer{
*/
public static function installShippedApps($softErrors = false) {
$errors = [];
- foreach(OC::$APPSROOTS as $app_dir) {
+ foreach(\OC::$APPSROOTS as $app_dir) {
if($dir = opendir( $app_dir['path'] )) {
while( false !== ( $filename = readdir( $dir ))) {
if( substr( $filename, 0, 1 ) != '.' and is_dir($app_dir['path']."/$filename") ) {
if( file_exists( $app_dir['path']."/$filename/appinfo/info.xml" )) {
- if(!OC_Installer::isInstalled($filename)) {
+ if(!Installer::isInstalled($filename)) {
$info=OC_App::getAppInfo($filename);
$enabled = isset($info['default_enable']);
if (($enabled || in_array($filename, \OC::$server->getAppManager()->getAlwaysEnabledApps()))
&& \OC::$server->getConfig()->getAppValue($filename, 'enabled') !== 'no') {
if ($softErrors) {
try {
- OC_Installer::installShippedApp($filename);
+ Installer::installShippedApp($filename);
} catch (\Doctrine\DBAL\Exception\TableExistsException $e) {
$errors[$filename] = $e;
continue;
}
} else {
- OC_Installer::installShippedApp($filename);
+ Installer::installShippedApp($filename);
}
\OC::$server->getConfig()->setAppValue($filename, 'enabled', 'yes');
}
@@ -590,6 +570,8 @@ class OC_Installer{
return false;
}
+ OC_App::executeRepairSteps($app, $info['repair-steps']['install']);
+
$config = \OC::$server->getConfig();
$config->setAppValue($app, 'installed_version', OC_App::getAppVersion($app));
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index 590b0bee721..5d10cd582f0 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -73,7 +73,6 @@ class Repair implements IOutput{
* Run a series of repair steps for common problems
*/
public function run() {
- $self = $this;
if (count($this->repairSteps) === 0) {
$this->emit('\OC\Repair', 'info', array('No repair steps available'));
return;
@@ -82,16 +81,6 @@ class Repair implements IOutput{
foreach ($this->repairSteps as $step) {
$this->currentStep = $step->getName();
$this->emit('\OC\Repair', 'step', [$this->currentStep]);
-
- if ($step instanceof Emitter) {
- $step->listen('\OC\Repair', 'warning', function ($description) use ($self) {
- $self->emit('\OC\Repair', 'warning', array($description));
- });
- $step->listen('\OC\Repair', 'info', function ($description) use ($self) {
- $self->emit('\OC\Repair', 'info', array($description));
- });
- }
-
$step->run($this);
}
}
diff --git a/lib/private/Setup.php b/lib/private/Setup.php
index 196ae8a8bce..23c66f98b7c 100644
--- a/lib/private/Setup.php
+++ b/lib/private/Setup.php
@@ -367,7 +367,7 @@ class Setup {
\OC_User::login($username, $password);
//guess what this does
- \OC_Installer::installShippedApps();
+ Installer::installShippedApps();
// create empty file in data dir, so we can later find
// out that this is indeed an ownCloud data directory
diff --git a/lib/private/Updater.php b/lib/private/Updater.php
index 093ebebbbe4..7ca3cd09362 100644
--- a/lib/private/Updater.php
+++ b/lib/private/Updater.php
@@ -36,7 +36,6 @@ namespace OC;
use OC\Hooks\BasicEmitter;
use OC\IntegrityCheck\Checker;
use OC_App;
-use OC_Installer;
use OCP\IConfig;
use OC\Setup;
use OCP\ILogger;
@@ -251,7 +250,7 @@ class Updater extends BasicEmitter {
// install new shipped apps on upgrade
OC_App::loadApps('authentication');
- $errors = OC_Installer::installShippedApps(true);
+ $errors = Installer::installShippedApps(true);
foreach ($errors as $appId => $exception) {
/** @var \Exception $exception */
$this->log->logException($exception, ['app' => $appId]);
@@ -443,11 +442,11 @@ class Updater extends BasicEmitter {
private function upgradeAppStoreApps(array $disabledApps) {
foreach($disabledApps as $app) {
try {
- if (OC_Installer::isUpdateAvailable($app)) {
+ if (Installer::isUpdateAvailable($app)) {
$ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', '');
$this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app));
- OC_Installer::updateAppByOCSId($ocsId);
+ Installer::updateAppByOCSId($ocsId);
}
} catch (\Exception $ex) {
$this->log->logException($ex, ['app' => 'core']);
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index 246bf97ee91..41b1b79e4f6 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -46,6 +46,7 @@
*/
use OC\App\DependencyAnalyzer;
use OC\App\Platform;
+use OC\Installer;
use OC\OCSClient;
use OC\Repair;
@@ -304,7 +305,7 @@ class OC_App {
*/
public static function enable($app, $groups = null) {
self::$enabledAppsCache = array(); // flush
- if (!OC_Installer::isInstalled($app)) {
+ if (!Installer::isInstalled($app)) {
$app = self::installApp($app);
}
@@ -340,7 +341,7 @@ class OC_App {
// Replace spaces in download link without encoding entire URL
$download['downloadlink'] = str_replace(' ', '%20', $download['downloadlink']);
$info = array('source' => 'http', 'href' => $download['downloadlink'], 'appdata' => $appData);
- $app = OC_Installer::installApp($info);
+ $app = Installer::installApp($info);
}
return $app;
}
@@ -354,7 +355,7 @@ class OC_App {
return false;
}
- return OC_Installer::removeApp($app);
+ return Installer::removeApp($app);
}
/**
@@ -369,9 +370,19 @@ class OC_App {
$app = self::getInternalAppIdByOcs($app);
}
- self::$enabledAppsCache = array(); // flush
- // check if app is a shipped app or not. if not delete
+ // flush
+ self::$enabledAppsCache = array();
+
+ // run uninstall steps
+ $appData = OC_App::getAppInfo($app);
+ if (!is_null($appData)) {
+ OC_App::executeRepairSteps($app, $appData['repair-steps']['uninstall']);
+ }
+
+ // emit disable hook - needed anymore ?
\OC_Hook::emit('OC_App', 'pre_disable', array('app' => $app));
+
+ // finally disable it
$appManager = \OC::$server->getAppManager();
$appManager->disableApp($app);
}
@@ -827,7 +838,7 @@ class OC_App {
$info['removable'] = true;
}
- $info['update'] = ($includeUpdateInfo) ? OC_Installer::isUpdateAvailable($app) : null;
+ $info['update'] = ($includeUpdateInfo) ? Installer::isUpdateAvailable($app) : null;
$appPath = self::getAppPath($app);
if($appPath !== false) {
@@ -1073,7 +1084,7 @@ class OC_App {
if ($appData && version_compare($shippedVersion, $appData['version'], '<')) {
$app = self::downloadApp($app);
} else {
- $app = OC_Installer::installShippedApp($app);
+ $app = Installer::installShippedApp($app);
}
} else {
// Maybe the app is already installed - compare the version in this
@@ -1187,7 +1198,7 @@ class OC_App {
* @param string[] $steps
* @throws \OC\NeedsUpdateException
*/
- private static function executeRepairSteps($appId, array $steps) {
+ public static function executeRepairSteps($appId, array $steps) {
if (empty($steps)) {
return;
}