mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 06:18:28 +01:00
a2e1e0d0f1
This should allow the admin to revert the upgrade of existing plugins, such when the dependency chain leads to a dead-end. Additionally, we archive (as a last-chance copy) the to-be-installed plugins when cancelling their installation. This is mainly for developers who could otherwise loose their code. For the same reason, plugins are being archived upon uninstallation, too.
217 lines
8.9 KiB
PHP
217 lines
8.9 KiB
PHP
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* UI for general plugins management
|
|
*
|
|
* @package core
|
|
* @subpackage admin
|
|
* @copyright 2011 David Mudrak <david@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
require_once(dirname(dirname(__FILE__)) . '/config.php');
|
|
require_once($CFG->libdir . '/adminlib.php');
|
|
require_once($CFG->libdir . '/filelib.php');
|
|
|
|
$fetchremote = optional_param('fetchremote', false, PARAM_BOOL); // Check for available plugins updates.
|
|
$updatesonly = optional_param('updatesonly', false, PARAM_BOOL); // Show updateable plugins only.
|
|
$contribonly = optional_param('contribonly', false, PARAM_BOOL); // Show additional plugins only.
|
|
$uninstall = optional_param('uninstall', '', PARAM_COMPONENT); // Uninstall the plugin.
|
|
$delete = optional_param('delete', '', PARAM_COMPONENT); // Delete the plugin folder after it is uninstalled.
|
|
$confirmed = optional_param('confirm', false, PARAM_BOOL); // Confirm the uninstall/delete action.
|
|
$return = optional_param('return', 'overview', PARAM_ALPHA); // Where to return after uninstall.
|
|
$installupdate = optional_param('installupdate', null, PARAM_COMPONENT); // Install given available update.
|
|
$installupdateversion = optional_param('installupdateversion', null, PARAM_INT); // Version of the available update to install.
|
|
$installupdatex = optional_param('installupdatex', false, PARAM_BOOL); // Install all available plugin updates.
|
|
$confirminstallupdate = optional_param('confirminstallupdate', false, PARAM_BOOL); // Available update(s) install confirmed?
|
|
|
|
// NOTE: do not use admin_externalpage_setup() here because it loads
|
|
// full admin tree which is not possible during uninstallation.
|
|
|
|
require_login();
|
|
$syscontext = context_system::instance();
|
|
require_capability('moodle/site:config', $syscontext);
|
|
|
|
// URL params we want to maintain on redirects.
|
|
$pageparams = array('updatesonly' => $updatesonly, 'contribonly' => $contribonly);
|
|
$pageurl = new moodle_url('/admin/plugins.php', $pageparams);
|
|
|
|
$pluginman = core_plugin_manager::instance();
|
|
|
|
if ($uninstall) {
|
|
require_sesskey();
|
|
|
|
if (!$confirmed) {
|
|
admin_externalpage_setup('pluginsoverview', '', $pageparams);
|
|
} else {
|
|
$PAGE->set_url($pageurl);
|
|
$PAGE->set_context($syscontext);
|
|
$PAGE->set_pagelayout('maintenance');
|
|
$PAGE->set_popup_notification_allowed(false);
|
|
}
|
|
|
|
/** @var core_admin_renderer $output */
|
|
$output = $PAGE->get_renderer('core', 'admin');
|
|
|
|
$pluginfo = $pluginman->get_plugin_info($uninstall);
|
|
|
|
// Make sure we know the plugin.
|
|
if (is_null($pluginfo)) {
|
|
throw new moodle_exception('err_uninstalling_unknown_plugin', 'core_plugin', '', array('plugin' => $uninstall),
|
|
'core_plugin_manager::get_plugin_info() returned null for the plugin to be uninstalled');
|
|
}
|
|
|
|
$pluginname = $pluginman->plugin_name($pluginfo->component);
|
|
$PAGE->set_title($pluginname);
|
|
$PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname)));
|
|
|
|
if (!$pluginman->can_uninstall_plugin($pluginfo->component)) {
|
|
throw new moodle_exception('err_cannot_uninstall_plugin', 'core_plugin', '',
|
|
array('plugin' => $pluginfo->component),
|
|
'core_plugin_manager::can_uninstall_plugin() returned false');
|
|
}
|
|
|
|
if (!$confirmed) {
|
|
$continueurl = new moodle_url($PAGE->url, array('uninstall' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1, 'return'=>$return));
|
|
$cancelurl = $pluginfo->get_return_url_after_uninstall($return);
|
|
echo $output->plugin_uninstall_confirm_page($pluginman, $pluginfo, $continueurl, $cancelurl);
|
|
exit();
|
|
|
|
} else {
|
|
$SESSION->pluginuninstallreturn = $pluginfo->get_return_url_after_uninstall($return);
|
|
$progress = new progress_trace_buffer(new text_progress_trace(), false);
|
|
$pluginman->uninstall_plugin($pluginfo->component, $progress);
|
|
$progress->finished();
|
|
|
|
if ($pluginman->is_plugin_folder_removable($pluginfo->component)) {
|
|
$continueurl = new moodle_url($PAGE->url, array('delete' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1));
|
|
echo $output->plugin_uninstall_results_removable_page($pluginman, $pluginfo, $progress, $continueurl);
|
|
// Reset op code caches.
|
|
if (function_exists('opcache_reset')) {
|
|
opcache_reset();
|
|
}
|
|
exit();
|
|
|
|
} else {
|
|
echo $output->plugin_uninstall_results_page($pluginman, $pluginfo, $progress);
|
|
// Reset op code caches.
|
|
if (function_exists('opcache_reset')) {
|
|
opcache_reset();
|
|
}
|
|
exit();
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($delete and $confirmed) {
|
|
require_sesskey();
|
|
|
|
$PAGE->set_url($pageurl);
|
|
$PAGE->set_context($syscontext);
|
|
$PAGE->set_pagelayout('maintenance');
|
|
$PAGE->set_popup_notification_allowed(false);
|
|
|
|
/** @var core_admin_renderer $output */
|
|
$output = $PAGE->get_renderer('core', 'admin');
|
|
|
|
$pluginfo = $pluginman->get_plugin_info($delete);
|
|
|
|
// Make sure we know the plugin.
|
|
if (is_null($pluginfo)) {
|
|
throw new moodle_exception('err_removing_unknown_plugin', 'core_plugin', '', array('plugin' => $delete),
|
|
'core_plugin_manager::get_plugin_info() returned null for the plugin to be deleted');
|
|
}
|
|
|
|
$pluginname = $pluginman->plugin_name($pluginfo->component);
|
|
$PAGE->set_title($pluginname);
|
|
$PAGE->navbar->add(get_string('uninstalling', 'core_plugin', array('name' => $pluginname)));
|
|
|
|
// Make sure it is not installed.
|
|
if (!is_null($pluginfo->versiondb)) {
|
|
throw new moodle_exception('err_removing_installed_plugin', 'core_plugin', '',
|
|
array('plugin' => $pluginfo->component, 'versiondb' => $pluginfo->versiondb),
|
|
'core_plugin_manager::get_plugin_info() returned not-null versiondb for the plugin to be deleted');
|
|
}
|
|
|
|
// Make sure the folder is within Moodle installation tree.
|
|
if (strpos($pluginfo->rootdir, $CFG->dirroot) !== 0) {
|
|
throw new moodle_exception('err_unexpected_plugin_rootdir', 'core_plugin', '',
|
|
array('plugin' => $pluginfo->component, 'rootdir' => $pluginfo->rootdir, 'dirroot' => $CFG->dirroot),
|
|
'plugin root folder not in the moodle dirroot');
|
|
}
|
|
|
|
// So long, and thanks for all the bugs.
|
|
$pluginman->remove_plugin_folder($pluginfo);
|
|
|
|
// We need to execute upgrade to make sure everything including caches is up to date.
|
|
redirect(new moodle_url('/admin/index.php'));
|
|
}
|
|
|
|
// Install all avilable updates.
|
|
if ($installupdatex) {
|
|
require_once($CFG->libdir.'/upgradelib.php');
|
|
require_sesskey();
|
|
|
|
$PAGE->set_url($pageurl);
|
|
$PAGE->set_context($syscontext);
|
|
$PAGE->set_pagelayout('maintenance');
|
|
$PAGE->set_popup_notification_allowed(false);
|
|
|
|
$installable = $pluginman->filter_installable($pluginman->available_updates());
|
|
upgrade_install_plugins($installable, $confirminstallupdate,
|
|
get_string('updateavailableinstallallhead', 'core_admin'),
|
|
new moodle_url($PAGE->url, array('installupdatex' => 1, 'confirminstallupdate' => 1))
|
|
);
|
|
}
|
|
|
|
// Install single available update.
|
|
if ($installupdate and $installupdateversion) {
|
|
require_once($CFG->libdir.'/upgradelib.php');
|
|
require_sesskey();
|
|
|
|
$PAGE->set_url($pageurl);
|
|
$PAGE->set_context($syscontext);
|
|
$PAGE->set_pagelayout('maintenance');
|
|
$PAGE->set_popup_notification_allowed(false);
|
|
|
|
if ($pluginman->is_remote_plugin_installable($installupdate, $installupdateversion)) {
|
|
$installable = array($pluginman->get_remote_plugin_info($installupdate, $installupdateversion, true));
|
|
upgrade_install_plugins($installable, $confirminstallupdate,
|
|
get_string('updateavailableinstallallhead', 'core_admin'),
|
|
new moodle_url($PAGE->url, array('installupdate' => $installupdate,
|
|
'installupdateversion' => $installupdateversion, 'confirminstallupdate' => 1)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
admin_externalpage_setup('pluginsoverview', '', $pageparams);
|
|
|
|
/** @var core_admin_renderer $output */
|
|
$output = $PAGE->get_renderer('core', 'admin');
|
|
|
|
$checker = \core\update\checker::instance();
|
|
|
|
if ($fetchremote) {
|
|
require_sesskey();
|
|
$checker->fetch();
|
|
redirect($PAGE->url);
|
|
}
|
|
|
|
echo $output->plugin_management_page($pluginman, $checker, $pageparams);
|