mirror of
https://github.com/moodle/moodle.git
synced 2025-04-13 12:32:08 +02:00
Merge branch 'MDL-47271-status-api-fixes' of https://github.com/brendanheywood/moodle
This commit is contained in:
commit
aae4b15631
171
admin/cli/checks.php
Normal file
171
admin/cli/checks.php
Normal file
@ -0,0 +1,171 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* CLI tool for system checks
|
||||
*
|
||||
* @package core
|
||||
* @category check
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
define('CLI_SCRIPT', true);
|
||||
|
||||
require(__DIR__ . '/../../config.php');
|
||||
require_once($CFG->libdir.'/clilib.php');
|
||||
|
||||
use core\check\result;
|
||||
|
||||
list($options, $unrecognized) = cli_get_params([
|
||||
'help' => false,
|
||||
'filter' => '',
|
||||
'type' => 'status',
|
||||
'verbose' => false,
|
||||
], [
|
||||
'h' => 'help',
|
||||
'f' => 'filter',
|
||||
'v' => 'verbose',
|
||||
't' => 'type',
|
||||
]);
|
||||
|
||||
if ($unrecognized) {
|
||||
$unrecognized = implode("\n ", $unrecognized);
|
||||
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
|
||||
}
|
||||
|
||||
$checks = \core\check\manager::get_checks($options['type']);
|
||||
$types = join(', ', \core\check\manager::TYPES);
|
||||
|
||||
$help = "Run Moodle system checks
|
||||
|
||||
Options:
|
||||
-h, --help Print out this help
|
||||
-f, --filter Filter to a subset of checks
|
||||
-t, --type Which set of checks? Defaults to 'status'
|
||||
One of $types
|
||||
-v, --verbose Show details of all checks, not just failed checks
|
||||
|
||||
Example:
|
||||
|
||||
sudo -u www-data php admin/cli/checks.php
|
||||
sudo -u www-data php admin/cli/checks.php -v
|
||||
sudo -u www-data php admin/cli/checks.php -v --filter=environment
|
||||
|
||||
";
|
||||
|
||||
if ($options['help']) {
|
||||
echo $help;
|
||||
die();
|
||||
}
|
||||
|
||||
$filter = $options['filter'];
|
||||
if ($filter) {
|
||||
$checks = array_filter($checks, function($check, $key) use ($filter) {
|
||||
$ref = $check->get_ref();
|
||||
return (strpos($ref, $filter) !== false);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
// These shell exit codes and labels align with the NRPE standard.
|
||||
$exitcodes = [
|
||||
result::NA => 0,
|
||||
result::OK => 0,
|
||||
result::INFO => 0,
|
||||
result::UNKNOWN => 3,
|
||||
result::WARNING => 1,
|
||||
result::ERROR => 2,
|
||||
result::CRITICAL => 2,
|
||||
];
|
||||
$exitlabel = [
|
||||
result::NA => 'OK',
|
||||
result::OK => 'OK',
|
||||
result::INFO => 'OK',
|
||||
result::UNKNOWN => 'UNKNOWN',
|
||||
result::WARNING => 'WARNING',
|
||||
result::ERROR => 'CRITICAL',
|
||||
result::CRITICAL => 'CRITICAL',
|
||||
];
|
||||
|
||||
$format = "% 10s| % -60s\n";
|
||||
$spacer = "----------+--------------------------------------------------------------------\n";
|
||||
$prefix = ' |';
|
||||
|
||||
$output = '';
|
||||
$header = $exitlabel[result::OK] . ': ' . get_string('checksok', '', $options['type']) . "\n";
|
||||
$exitcode = $exitcodes[result::OK];
|
||||
|
||||
foreach ($checks as $check) {
|
||||
$ref = $check->get_ref();
|
||||
$result = $check->get_result();
|
||||
|
||||
$status = $result->get_status();
|
||||
$checkexitcode = $exitcodes[$status];
|
||||
|
||||
// Summary is treated as html.
|
||||
$summary = $result->get_summary();
|
||||
$summary = html_to_text($summary, 60, false);
|
||||
|
||||
if ($checkexitcode > $exitcode) {
|
||||
$exitcode = $checkexitcode;
|
||||
$header = $exitlabel[$status] . ': ' . $check->get_name() . " (" . $check->get_ref() . ")\n";
|
||||
}
|
||||
|
||||
if (empty($messages[$status])) {
|
||||
$messages[$status] = $result;
|
||||
}
|
||||
|
||||
$len = strlen(get_string('status' . $status));
|
||||
|
||||
if ($options['verbose'] ||
|
||||
$status == result::WARNING ||
|
||||
$status == result::CRITICAL ||
|
||||
$status == result::ERROR) {
|
||||
|
||||
$output .= sprintf(
|
||||
$format,
|
||||
$OUTPUT->check_result($result),
|
||||
sprintf('%s (%s)', $check->get_name(), $ref)
|
||||
);
|
||||
|
||||
$summary = str_replace("\n", "\n" . $prefix . ' ', $summary);
|
||||
$output .= sprintf( $format, '', ' ' . $summary);
|
||||
|
||||
if ($options['verbose']) {
|
||||
$actionlink = $check->get_action_link();
|
||||
if ($actionlink) {
|
||||
$output .= sprintf( $format, '', ' ' . $actionlink->url);
|
||||
}
|
||||
$output .= sprintf( $format, '', '');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Print NRPE header.
|
||||
print $header;
|
||||
|
||||
// Only show the table header if there is anything to show.
|
||||
if ($output) {
|
||||
print sprintf($format,
|
||||
get_string('status'). ' ',
|
||||
get_string('check')
|
||||
) . $spacer;
|
||||
print $output;
|
||||
}
|
||||
|
||||
// NRPE shell exit code.
|
||||
exit($exitcode);
|
||||
|
@ -843,8 +843,9 @@ $errorsdisplayed = defined('WARN_DISPLAY_ERRORS_ENABLED');
|
||||
$lastcron = get_config('tool_task', 'lastcronstart');
|
||||
$cronoverdue = ($lastcron < time() - 3600 * 24);
|
||||
$lastcroninterval = get_config('tool_task', 'lastcroninterval');
|
||||
$expectedfrequency = $CFG->expectedcronfrequency ?? 200;
|
||||
$croninfrequent = !$cronoverdue && ($lastcroninterval > $expectedfrequency || $lastcron < time() - $expectedfrequency);
|
||||
|
||||
$expectedfrequency = $CFG->expectedcronfrequency ?? MINSECS;
|
||||
$croninfrequent = !$cronoverdue && ($lastcroninterval > ($expectedfrequency + MINSECS) || $lastcron < time() - $expectedfrequency);
|
||||
$dbproblems = $DB->diagnose();
|
||||
$maintenancemode = !empty($CFG->maintenance_enabled);
|
||||
|
||||
|
@ -601,19 +601,9 @@ class core_admin_renderer extends plugin_renderer_base {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (empty($CFG->cronclionly)) {
|
||||
$url = new moodle_url('/admin/cron.php');
|
||||
if (!empty($CFG->cronremotepassword)) {
|
||||
$url = new moodle_url('/admin/cron.php', array('password' => $CFG->cronremotepassword));
|
||||
}
|
||||
|
||||
return $this->warning(get_string('cronwarning', 'admin', $url->out()) . ' ' .
|
||||
$this->help_icon('cron', 'admin'));
|
||||
}
|
||||
|
||||
// $CFG->cronclionly is not empty: cron can run only from CLI.
|
||||
return $this->warning(get_string('cronwarningcli', 'admin') . ' ' .
|
||||
$this->help_icon('cron', 'admin'));
|
||||
$check = new \tool_task\check\cronrunning();
|
||||
$result = $check->get_result();
|
||||
return $this->warning($result->get_summary() . ' ' . $this->help_icon('cron', 'admin'));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -629,9 +619,9 @@ class core_admin_renderer extends plugin_renderer_base {
|
||||
return '';
|
||||
}
|
||||
|
||||
$expectedfrequency = $CFG->expectedcronfrequency ?? 200;
|
||||
return $this->warning(get_string('croninfrequent', 'admin', $expectedfrequency) . ' ' .
|
||||
$this->help_icon('cron', 'admin'));
|
||||
$check = new \tool_task\check\cronrunning();
|
||||
$result = $check->get_result();
|
||||
return $this->warning($result->get_summary() . ' ' . $this->help_icon('cron', 'admin'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
93
admin/tool/task/classes/check/adhocqueue.php
Normal file
93
admin/tool/task/classes/check/adhocqueue.php
Normal file
@ -0,0 +1,93 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Ad hoc queue checks
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace tool_task\check;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
|
||||
/**
|
||||
* Ad hoc queue checks
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class adhocqueue extends check {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
global $CFG;
|
||||
$this->id = 'adhocqueue';
|
||||
$this->name = get_string('checkadhocqueue', 'tool_task');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return result
|
||||
* @return result
|
||||
*/
|
||||
public function get_result() : result {
|
||||
global $DB, $CFG;
|
||||
|
||||
$stats = $DB->get_record_sql('
|
||||
SELECT count(*) cnt,
|
||||
MAX(? - nextruntime) age
|
||||
FROM {task_adhoc}', [time()]);
|
||||
|
||||
$status = result::OK;
|
||||
$summary = get_string('adhocempty', 'tool_task');
|
||||
$details = '';
|
||||
|
||||
if ($stats->cnt > 0) {
|
||||
// A large queue size by itself is not an issue, only when tasks
|
||||
// are not being processed in a timely fashion is it an issue.
|
||||
$status = result::INFO;
|
||||
$summary = get_string('adhocqueuesize', 'tool_task', $stats->cnt);
|
||||
}
|
||||
|
||||
$max = $CFG->adhoctaskagewarn ?? 10 * MINSECS;
|
||||
if ($stats->age > $max) {
|
||||
$status = result::WARNING;
|
||||
$summary = get_string('adhocqueueold', 'tool_task', [
|
||||
'age' => format_time($stats->age),
|
||||
'max' => format_time($max),
|
||||
]);
|
||||
}
|
||||
|
||||
$max = $CFG->adhoctaskageerror ?? 4 * HOURSECS;
|
||||
if ($stats->age > $max) {
|
||||
$status = result::ERROR;
|
||||
$summary = get_string('adhocqueueold', 'tool_task', [
|
||||
'age' => format_time($stats->age),
|
||||
'max' => format_time($max),
|
||||
]);
|
||||
}
|
||||
|
||||
return new result($status, $summary, $details);
|
||||
}
|
||||
}
|
118
admin/tool/task/classes/check/cronrunning.php
Normal file
118
admin/tool/task/classes/check/cronrunning.php
Normal file
@ -0,0 +1,118 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Cron running check
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace tool_task\check;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
/**
|
||||
* Cron running check
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class cronrunning extends check {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
global $CFG;
|
||||
$this->id = 'cronrunning';
|
||||
$this->name = get_string('checkcronrunning', 'tool_task');
|
||||
if (empty($CFG->cronclionly)) {
|
||||
$this->actionlink = new \action_link(
|
||||
new \moodle_url('/admin/cron.php'),
|
||||
get_string('cron', 'admin'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return result
|
||||
* @return result
|
||||
*/
|
||||
public function get_result() : result {
|
||||
global $CFG;
|
||||
|
||||
// Eventually this should replace cron_overdue_warning and
|
||||
// cron_infrequent_warning.
|
||||
$lastcron = get_config('tool_task', 'lastcronstart');
|
||||
$expectedfrequency = $CFG->expectedcronfrequency ?? MINSECS;
|
||||
|
||||
$delta = time() - $lastcron;
|
||||
|
||||
$lastcroninterval = get_config('tool_task', 'lastcroninterval');
|
||||
|
||||
$formatdelta = format_time($delta);
|
||||
$formatexpected = format_time($expectedfrequency);
|
||||
$formatinterval = format_time($lastcroninterval);
|
||||
|
||||
$details = format_time($delta);
|
||||
|
||||
if ($delta > $expectedfrequency + MINSECS) {
|
||||
$status = result::WARNING;
|
||||
|
||||
if ($delta > DAYSECS) {
|
||||
$status = result::CRITICAL;
|
||||
}
|
||||
|
||||
if (empty($lastcron)) {
|
||||
$summary = get_string('cronwarningnever', 'admin', [
|
||||
'expected' => $formatexpected,
|
||||
]);
|
||||
} else if (empty($CFG->cronclionly)) {
|
||||
$url = new \moodle_url('/admin/cron.php');
|
||||
$summary = get_string('cronwarning', 'admin', [
|
||||
'url' => $url->out(),
|
||||
'actual' => $formatdelta,
|
||||
'expected' => $formatexpected,
|
||||
]);
|
||||
} else {
|
||||
$summary = get_string('cronwarningcli', 'admin', [
|
||||
'actual' => $formatdelta,
|
||||
'expected' => $formatexpected,
|
||||
]);
|
||||
}
|
||||
return new result($status, $summary, $details);
|
||||
}
|
||||
|
||||
if ($lastcroninterval > $expectedfrequency) {
|
||||
$status = result::WARNING;
|
||||
$summary = get_string('croninfrequent', 'admin', [
|
||||
'actual' => $formatinterval,
|
||||
'expected' => $formatexpected,
|
||||
]);
|
||||
return new result($status, $summary, $details);
|
||||
}
|
||||
|
||||
$status = result::OK;
|
||||
$summary = get_string('cronok', 'tool_task');
|
||||
|
||||
return new result($status, $summary, $details);
|
||||
}
|
||||
}
|
||||
|
96
admin/tool/task/classes/check/maxfaildelay.php
Normal file
96
admin/tool/task/classes/check/maxfaildelay.php
Normal file
@ -0,0 +1,96 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Task fail delay check
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace tool_task\check;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
|
||||
/**
|
||||
* Task fail delay check
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class maxfaildelay extends check {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
global $CFG;
|
||||
$this->id = 'cronfaildelay';
|
||||
$this->name = get_string('checkmaxfaildelay', 'tool_task');
|
||||
$this->actionlink = new \action_link(
|
||||
new \moodle_url('/admin/tool/task/scheduledtasks.php'),
|
||||
get_string('scheduledtasks', 'tool_task'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return result
|
||||
* @return result
|
||||
*/
|
||||
public function get_result() : result {
|
||||
global $CFG;
|
||||
|
||||
$status = result::OK;
|
||||
$summary = get_string('tasknofailures', 'tool_task');
|
||||
$details = '';
|
||||
$failures = 0;
|
||||
$maxdelay = 0;
|
||||
|
||||
$tasks = \core\task\manager::get_all_scheduled_tasks();
|
||||
foreach ($tasks as $task) {
|
||||
if ($task->get_disabled()) {
|
||||
continue;
|
||||
}
|
||||
$faildelay = $task->get_fail_delay();
|
||||
if ($faildelay > $maxdelay) {
|
||||
$maxdelay = $faildelay;
|
||||
}
|
||||
if ($faildelay > 0) {
|
||||
$failures++;
|
||||
$details .= get_string('faildelay', 'tool_task') . ': ' . format_time($faildelay);
|
||||
$details .= ' - ' . $task->get_name() . ' (' .get_class($task) . ")<br>";
|
||||
}
|
||||
}
|
||||
|
||||
if ($failures > 0) {
|
||||
// Intermittent failures are not yet a warning.
|
||||
$status = result::INFO;
|
||||
$summary = get_string('taskfailures', 'tool_task', $failures);
|
||||
}
|
||||
if ($maxdelay > 5 * MINSECS) {
|
||||
$status = result::WARNING;
|
||||
}
|
||||
if ($maxdelay > 4 * HOURSECS) {
|
||||
$status = result::ERROR;
|
||||
}
|
||||
|
||||
return new result($status, $summary, $details);
|
||||
}
|
||||
}
|
@ -23,12 +23,19 @@
|
||||
*/
|
||||
|
||||
$string['asap'] = 'ASAP';
|
||||
$string['adhocempty'] = 'Adhoc task queue is empty';
|
||||
$string['adhocqueuesize'] = 'Adhoc task queue has {$a} tasks';
|
||||
$string['adhocqueueold'] = 'Oldest task is {$a->age} which is more than {$a->max}';
|
||||
$string['backtoscheduledtasks'] = 'Back to scheduled tasks';
|
||||
$string['blocking'] = 'Blocking';
|
||||
$string['cannotfindthepathtothecli'] = 'Cannot find the path to the PHP CLI executable so task execution aborted. Set the \'Path to PHP CLI\' setting in Site administration / Server / System paths.';
|
||||
$string['checkadhocqueue'] = 'Adhoc task queue';
|
||||
$string['checkcronrunning'] = 'Cron running';
|
||||
$string['checkmaxfaildelay'] = 'Tasks max fail delay';
|
||||
$string['clearfaildelay_confirm'] = 'Are you sure you want to clear the fail delay for task \'{$a}\'? After clearing the delay, the task will run according to its normal schedule.';
|
||||
$string['component'] = 'Component';
|
||||
$string['corecomponent'] = 'Core';
|
||||
$string['cronok'] = 'Cron is running frequently';
|
||||
$string['default'] = 'Default';
|
||||
$string['defaultx'] = 'Default: {$a}';
|
||||
$string['disabled'] = 'Disabled';
|
||||
@ -51,7 +58,9 @@ $string['runpattern'] = 'Run pattern';
|
||||
$string['scheduledtasks'] = 'Scheduled tasks';
|
||||
$string['scheduledtaskchangesdisabled'] = 'Modifications to the list of scheduled tasks have been prevented in Moodle configuration';
|
||||
$string['taskdisabled'] = 'Task disabled';
|
||||
$string['taskfailures'] = 'There are {$a} task(s) failing';
|
||||
$string['tasklogs'] = 'Task logs';
|
||||
$string['tasknofailures'] = 'There are no tasks failing';
|
||||
$string['taskscheduleday'] = 'Day';
|
||||
$string['taskscheduleday_help'] = 'Day of month field for task schedule. The field uses the same format as unix cron. Some examples are:
|
||||
|
||||
|
39
admin/tool/task/lib.php
Normal file
39
admin/tool/task/lib.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Task API status checks
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Add cron related service status checks
|
||||
*
|
||||
* @return array of check objects
|
||||
*/
|
||||
function tool_task_status_checks() : array {
|
||||
return [
|
||||
new \tool_task\check\cronrunning(),
|
||||
new \tool_task\check\maxfaildelay(),
|
||||
new \tool_task\check\adhocqueue(),
|
||||
];
|
||||
}
|
||||
|
@ -616,6 +616,12 @@ $CFG->admin = 'admin';
|
||||
//
|
||||
// $CFG->expectedcronfrequency = 200;
|
||||
//
|
||||
// Moodle 3.9+ checks how old tasks are in the ad hoc queue and warns at 10 minutes
|
||||
// and errors at 4 hours. Set these to override these limits:
|
||||
//
|
||||
// $CFG->adhoctaskagewarn = 10 * 60;
|
||||
// $CFG->adhoctaskageerror = 4 * 60 * 60;
|
||||
//
|
||||
// Session lock warning threshold. Long running pages should release the session using \core\session\manager::write_close().
|
||||
// Set this threshold to any value greater than 0 to add developer warnings when a page locks the session for too long.
|
||||
// The session should rarely be locked for more than 1 second. The input should be in seconds and may be a float.
|
||||
|
@ -117,6 +117,7 @@ $string['cannotuninstall'] = '{$a} can not be uninstalled.';
|
||||
$string['categoryemail'] = 'Email';
|
||||
$string['cfgwwwrootslashwarning'] = '$CFG->wwwroot is defined incorrectly in the config.php file. It includes a \'/\' character at the end which must be removed.';
|
||||
$string['cfgwwwrootwarning'] = '$CFG->wwwroot is defined incorrectly in the config.php file. It should match the URL you are using to access this page.';
|
||||
$string['checkupgradepending'] = 'Upgrade';
|
||||
$string['cleanup'] = 'Cleanup';
|
||||
$string['clianswerno'] = 'n';
|
||||
$string['cliansweryes'] = 'y';
|
||||
@ -428,10 +429,11 @@ $string['cron_link'] = 'admin/cron';
|
||||
$string['cronclionly'] = 'Cron execution via command line only';
|
||||
$string['cronerrorclionly'] = 'Sorry, internet access to this page has been disabled by the administrator.';
|
||||
$string['cronerrorpassword'] = 'Sorry, you have not provided a valid password to access this page';
|
||||
$string['croninfrequent'] = 'The time between the last two runs of the cron maintenance script was over {$a} seconds. We recommend configuring it to run more frequently.';
|
||||
$string['croninfrequent'] = 'There was {$a->actual} between the last two runs of the cron maintenance script and it should run every {$a->expected}. We recommend configuring it to run more frequently.';
|
||||
$string['cronremotepassword'] = 'Cron password for remote access';
|
||||
$string['cronwarning'] = 'The <a href="{$a}">cron.php maintenance script</a> has not been run for at least 24 hours.';
|
||||
$string['cronwarningcli'] = 'The cli/cron.php maintenance script has not been run for at least 24 hours.';
|
||||
$string['cronwarning'] = 'The <a href="{$a->url}">admin/cron.php script</a> has not been run for {$a->actual} and should run every {$a->expected}.';
|
||||
$string['cronwarningcli'] = 'The <code>admin/cli/cron.php</code> script has not been run for {$a->actual} and should run every {$a->expected}.';
|
||||
$string['cronwarningnever'] = 'The <code>admin/cli/cron.php</code> script has never been run and should run every {$a->expected}.';
|
||||
$string['ctyperequired'] = 'The ctype PHP extension is now required by Moodle, in order to improve site performance and to offer multilingual compatibility.';
|
||||
$string['curlsecurityallowedport'] = 'cURL allowed ports list';
|
||||
$string['curlsecurityallowedportsyntax'] = 'List of port numbers that cURL can connect to. Valid entries are integer numbers only. Put each entry on a new line. If left empty, then all ports are allowed. If set, in almost all cases, both 443 and 80 should be specified for cURL to connect to standard HTTPS and HTTP ports.';
|
||||
|
@ -509,6 +509,7 @@ $string['description'] = 'Description';
|
||||
$string['descriptiona'] = 'Description: {$a}';
|
||||
$string['deselectall'] = 'Deselect all';
|
||||
$string['deselectnos'] = 'Deselect all \'No\'';
|
||||
$string['details'] = 'Details';
|
||||
$string['detailedless'] = 'Less detailed';
|
||||
$string['detailedmore'] = 'More detailed';
|
||||
$string['digitalminor'] = 'Digital minor';
|
||||
@ -1000,6 +1001,7 @@ $string['changepassword'] = 'Change password';
|
||||
$string['changessaved'] = 'Changes saved';
|
||||
$string['check'] = 'Check';
|
||||
$string['checks'] = 'Checks';
|
||||
$string['checksok'] = 'All \'{$a}\' checks ok';
|
||||
$string['checkall'] = 'Check all';
|
||||
$string['checkingbackup'] = 'Checking backup';
|
||||
$string['checkingcourse'] = 'Checking course';
|
||||
|
83
lib/classes/check/environment/environment.php
Normal file
83
lib/classes/check/environment/environment.php
Normal file
@ -0,0 +1,83 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Environment check
|
||||
*
|
||||
* @package core
|
||||
* @category check
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core\check\environment;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
|
||||
/**
|
||||
* Environment check
|
||||
*
|
||||
* @package core
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class environment extends check {
|
||||
|
||||
/**
|
||||
* Get the short check name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_name(): string {
|
||||
return get_string('environment', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* A link to a place to action this
|
||||
*
|
||||
* @return action_link|null
|
||||
*/
|
||||
public function get_action_link(): ?\action_link {
|
||||
return new \action_link(
|
||||
new \moodle_url('/admin/environment.php'),
|
||||
get_string('environment', 'admin'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return result
|
||||
* @return result
|
||||
*/
|
||||
public function get_result(): result {
|
||||
global $CFG;
|
||||
|
||||
require_once($CFG->libdir.'/environmentlib.php');
|
||||
list($status, $details) = check_moodle_environment($CFG->release, ENV_SELECT_NEWER);
|
||||
|
||||
if ($status) {
|
||||
$summary = get_string('environmentok', 'admin');
|
||||
$status = result::OK;
|
||||
} else {
|
||||
$summary = get_string('environmenterrortodo', 'admin');
|
||||
$status = result::ERROR;
|
||||
}
|
||||
|
||||
return new result($status, $summary, '');
|
||||
}
|
||||
}
|
||||
|
85
lib/classes/check/environment/upgradecheck.php
Normal file
85
lib/classes/check/environment/upgradecheck.php
Normal file
@ -0,0 +1,85 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Upgrade check
|
||||
*
|
||||
* @package core
|
||||
* @category check
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core\check\environment;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
|
||||
/**
|
||||
* Upgrade check
|
||||
*
|
||||
* @package core
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class upgradecheck extends check {
|
||||
|
||||
/**
|
||||
* Get the short check name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_name(): string {
|
||||
return get_string('checkupgradepending', 'admin');
|
||||
}
|
||||
|
||||
/**
|
||||
* A link to a place to action this
|
||||
*
|
||||
* @return action_link|null
|
||||
*/
|
||||
public function get_action_link(): ?\action_link {
|
||||
return new \action_link(
|
||||
new \moodle_url('/admin/index.php?cache=1'),
|
||||
get_string('notifications', 'admin'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return result
|
||||
* @return result
|
||||
*/
|
||||
public function get_result(): result {
|
||||
global $CFG;
|
||||
|
||||
require("$CFG->dirroot/version.php");
|
||||
$newversion = "$release ($version)";
|
||||
|
||||
if ($version < $CFG->version) {
|
||||
$status = result::ERROR;
|
||||
$summary = get_string('downgradedcore', 'error');
|
||||
} else if (moodle_needs_upgrading()) {
|
||||
$status = result::ERROR;
|
||||
$summary = get_string('cliupgradepending', 'admin');
|
||||
} else {
|
||||
$status = result::OK;
|
||||
$summary = get_string('cliupgradenoneed', 'core_admin', $newversion);
|
||||
}
|
||||
return new result($status, $summary);
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ class manager {
|
||||
/**
|
||||
* The list of valid check types
|
||||
*/
|
||||
public const TYPES = ['security'];
|
||||
public const TYPES = ['status', 'security'];
|
||||
|
||||
/**
|
||||
* Return all status checks
|
||||
@ -57,6 +57,32 @@ class manager {
|
||||
return $checks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all status checks
|
||||
*
|
||||
* @return array of check objects
|
||||
*/
|
||||
public static function get_status_checks(): array {
|
||||
$checks = [
|
||||
new environment\environment(),
|
||||
new environment\upgradecheck(),
|
||||
];
|
||||
|
||||
// Any plugin can add status checks to this report by implementing a callback
|
||||
// <component>_status_checks() which returns a check object.
|
||||
$morechecks = get_plugins_with_function('status_checks', 'lib.php');
|
||||
foreach ($morechecks as $plugintype => $plugins) {
|
||||
foreach ($plugins as $plugin => $pluginfunction) {
|
||||
$result = $pluginfunction();
|
||||
foreach ($result as $check) {
|
||||
$check->set_component($plugintype . '_' . $plugin);
|
||||
$checks[] = $check;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $checks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all security checks
|
||||
*
|
||||
|
141
lib/classes/check/table.php
Normal file
141
lib/classes/check/table.php
Normal file
@ -0,0 +1,141 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* A table of check results
|
||||
*
|
||||
* @package core
|
||||
* @category check
|
||||
* @copyright 2020 Brendan Heywood <brendan@catalyst-au.net>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace core\check;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* A table of check results
|
||||
*
|
||||
* @copyright 2020 Brendan Heywood <brendan@catalyst-au.net>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class table implements \renderable {
|
||||
|
||||
/**
|
||||
* @var moodle_url $url
|
||||
*/
|
||||
protected $url = '';
|
||||
|
||||
/**
|
||||
* @var string $type What type of checks
|
||||
*/
|
||||
protected $type = '';
|
||||
|
||||
/**
|
||||
* @var check $detail a specific check to focus on
|
||||
*/
|
||||
public $detail = '';
|
||||
|
||||
/**
|
||||
* @var array $checks shown in this table
|
||||
*/
|
||||
public $checks = [];
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $type of check
|
||||
* @param string $url of report
|
||||
* @param string $detail check to focus on
|
||||
*/
|
||||
public function __construct($type, $url, $detail = '') {
|
||||
|
||||
// We may need a bit more memory and this may take a long time to process.
|
||||
\raise_memory_limit(MEMORY_EXTRA);
|
||||
\core_php_time_limit::raise();
|
||||
|
||||
$this->type = $type;
|
||||
$this->url = $url;
|
||||
$this->checks = \core\check\manager::get_checks($type);
|
||||
|
||||
if ($detail) {
|
||||
$this->checks = array_filter($this->checks, function($check) use ($detail) {
|
||||
return $detail == $check->get_ref();
|
||||
});
|
||||
if (!empty($this->checks)) {
|
||||
$this->detail = reset($this->checks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a table of checks
|
||||
*
|
||||
* @param renderer $output to use
|
||||
* @return string html output
|
||||
*/
|
||||
public function render($output) {
|
||||
|
||||
$table = new \html_table();
|
||||
$table->data = [];
|
||||
$table->head = [
|
||||
get_string('status'),
|
||||
get_string('check'),
|
||||
get_string('summary'),
|
||||
get_string('action'),
|
||||
];
|
||||
$table->colclasses = [
|
||||
'rightalign status',
|
||||
'leftalign check',
|
||||
'leftalign summary',
|
||||
'leftalign action',
|
||||
];
|
||||
$table->id = $this->type . 'reporttable';
|
||||
$table->attributes = ['class' => 'admintable ' . $this->type . 'report generaltable'];
|
||||
|
||||
foreach ($this->checks as $check) {
|
||||
$ref = $check->get_ref();
|
||||
$result = $check->get_result();
|
||||
$component = $check->get_component();
|
||||
$actionlink = $check->get_action_link();
|
||||
|
||||
$link = new \moodle_url($this->url, ['detail' => $ref]);
|
||||
|
||||
$row = [];
|
||||
$row[] = $output->check_result($result);
|
||||
$row[] = $output->action_link($link, $check->get_name());
|
||||
|
||||
$row[] = $result->get_summary();
|
||||
if ($actionlink) {
|
||||
$row[] = $output->render($actionlink);
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
|
||||
$table->data[] = $row;
|
||||
}
|
||||
$html = \html_writer::table($table);
|
||||
|
||||
if ($this->detail && $result) {
|
||||
$html .= $output->heading(get_string('details'), 3);
|
||||
$html .= $output->box($result->get_details(), 'generalbox boxwidthnormal boxaligncenter');
|
||||
$html .= $output->continue_button($this->url);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
|
@ -242,38 +242,51 @@ function cli_ansi_format(string $message): string {
|
||||
"<bell>" => "\007",
|
||||
|
||||
// Cursor movement: https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html.
|
||||
"<cursor:save>" => "\033[s",
|
||||
"<cursor:restore>" => "\033[u",
|
||||
"<cursor:up>" => "\033[1A",
|
||||
"<cursor:down>" => "\033[1B",
|
||||
"<cursor:forward>" => "\033[1C",
|
||||
"<cursor:back>" => "\033[1D",
|
||||
"<cursor:save>" => "\033[s",
|
||||
"<cursor:restore>" => "\033[u",
|
||||
"<cursor:up>" => "\033[1A",
|
||||
"<cursor:down>" => "\033[1B",
|
||||
"<cursor:forward>" => "\033[1C",
|
||||
"<cursor:back>" => "\033[1D",
|
||||
];
|
||||
|
||||
$colours = [
|
||||
'normal' => '0;0',
|
||||
'black' => '0;30',
|
||||
'darkGray' => '1;30',
|
||||
'blue' => '0;34',
|
||||
'lightBlue' => '1;34',
|
||||
'green' => '0;32',
|
||||
'lightGreen' => '1;32',
|
||||
'cyan' => '0;36',
|
||||
'lightCyan' => '1;36',
|
||||
'red' => '0;31',
|
||||
'lightRed' => '1;31',
|
||||
'purple' => '0;35',
|
||||
'lightPurple' => '1;35',
|
||||
'brown' => '0;33',
|
||||
'yellow' => '1;33',
|
||||
'lightYellow' => '0;93',
|
||||
'lightGray' => '0;37',
|
||||
'white' => '1;37',
|
||||
'normal' => '0;0',
|
||||
'black' => '0;30',
|
||||
'darkGray' => '1;30',
|
||||
'red' => '0;31',
|
||||
'lightRed' => '1;31',
|
||||
'green' => '0;32',
|
||||
'lightGreen' => '1;32',
|
||||
'brown' => '0;33',
|
||||
'yellow' => '1;33',
|
||||
'lightYellow' => '0;93',
|
||||
'blue' => '0;34',
|
||||
'lightBlue' => '1;34',
|
||||
'purple' => '0;35',
|
||||
'lightPurple' => '1;35',
|
||||
'cyan' => '0;36',
|
||||
'lightCyan' => '1;36',
|
||||
'lightGray' => '0;37',
|
||||
'white' => '1;37',
|
||||
];
|
||||
$bgcolours = [
|
||||
'black' => '40',
|
||||
'red' => '41',
|
||||
'green' => '42',
|
||||
'yellow' => '43',
|
||||
'blue' => '44',
|
||||
'magenta' => '45',
|
||||
'cyan' => '46',
|
||||
'white' => '47',
|
||||
];
|
||||
|
||||
foreach ($colours as $colour => $code) {
|
||||
$replacements["<colour:{$colour}>"] = "\033[{$code}m";
|
||||
}
|
||||
foreach ($bgcolours as $colour => $code) {
|
||||
$replacements["<bgcolour:{$colour}>"] = "\033[{$code}m";
|
||||
}
|
||||
|
||||
// Windows don't support ANSI code by default, but does if ANSICON is available.
|
||||
$isansicon = getenv('ANSICON');
|
||||
|
@ -4775,6 +4775,41 @@ class core_renderer_cli extends core_renderer {
|
||||
return $this->page->heading . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a Check API result
|
||||
*
|
||||
* To aid in CLI consistency this status is NOT translated and the visual
|
||||
* width is always exactly 10 chars.
|
||||
*
|
||||
* @param result $result
|
||||
* @return string HTML fragment
|
||||
*/
|
||||
protected function render_check_result(core\check\result $result) {
|
||||
$status = $result->get_status();
|
||||
|
||||
$labels = [
|
||||
core\check\result::NA => ' ' . cli_ansi_format('<colour:gray>' ) . ' NA ',
|
||||
core\check\result::OK => ' ' . cli_ansi_format('<colour:green>') . ' OK ',
|
||||
core\check\result::INFO => ' ' . cli_ansi_format('<colour:blue>' ) . ' INFO ',
|
||||
core\check\result::UNKNOWN => ' ' . cli_ansi_format('<colour:grey>' ) . ' UNKNOWN ',
|
||||
core\check\result::WARNING => ' ' . cli_ansi_format('<colour:black><bgcolour:yellow>') . ' WARNING ',
|
||||
core\check\result::ERROR => ' ' . cli_ansi_format('<bgcolour:red>') . ' ERROR ',
|
||||
core\check\result::CRITICAL => '' . cli_ansi_format('<bgcolour:red>') . ' CRITICAL ',
|
||||
];
|
||||
$string = $labels[$status] . cli_ansi_format('<colour:normal>');
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a Check API result
|
||||
*
|
||||
* @param result $result
|
||||
* @return string fragment
|
||||
*/
|
||||
public function check_result(core\check\result $result) {
|
||||
return $this->render_check_result($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a template fragment representing a Heading.
|
||||
*
|
||||
|
@ -27,87 +27,23 @@ define('NO_OUTPUT_BUFFERING', true);
|
||||
require('../../config.php');
|
||||
require_once($CFG->libdir.'/adminlib.php');
|
||||
|
||||
use core\check\check;
|
||||
use core\check\result;
|
||||
|
||||
// Print the header.
|
||||
admin_externalpage_setup('reportsecurity', '', null, '', ['pagelayout' => 'report']);
|
||||
|
||||
// We may need a bit more memory and this may take a long time to process.
|
||||
raise_memory_limit(MEMORY_EXTRA);
|
||||
core_php_time_limit::raise();
|
||||
|
||||
$checks = \core\check\manager::get_security_checks();
|
||||
|
||||
$detail = optional_param('detail', '', PARAM_TEXT); // Show detailed info about one check only.
|
||||
if ($detail) {
|
||||
$checks = array_filter($checks, function($check) use ($detail) {
|
||||
return $detail == $check->get_ref();
|
||||
});
|
||||
$checks = array_values($checks);
|
||||
if (!empty($checks)) {
|
||||
$PAGE->set_docs_path('report/security/index.php?detail=' . $detail);
|
||||
$PAGE->navbar->add($checks[0]->get_name());
|
||||
}
|
||||
|
||||
$url = '/report/security/index.php';
|
||||
$table = new core\check\table('security', $url, $detail);
|
||||
|
||||
if (!empty($table->detail)) {
|
||||
$PAGE->set_docs_path($url . '?detail=' . $detail);
|
||||
$PAGE->navbar->add($table->detail->get_name());
|
||||
}
|
||||
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading(get_string('pluginname', 'report_security'));
|
||||
|
||||
echo '<div id="timewarning">' . get_string('timewarning', 'report_security') . '</div>';
|
||||
|
||||
$url = "$CFG->wwwroot/report/security/index.php";
|
||||
|
||||
$PAGE->requires->js_init_code("Y.one('#timewarning').addClass('timewarninghidden')");
|
||||
$table = new html_table();
|
||||
$table->data = [];
|
||||
$table->head = [
|
||||
get_string('status'),
|
||||
get_string('check'),
|
||||
get_string('summary'),
|
||||
get_string('action'),
|
||||
];
|
||||
$table->colclasses = [
|
||||
'rightalign status',
|
||||
'leftalign check',
|
||||
'leftalign summary',
|
||||
'leftalign action',
|
||||
];
|
||||
$table->id = 'securityreporttable';
|
||||
$table->attributes = ['class' => 'admintable securityreport generaltable'];
|
||||
|
||||
$manager = core_plugin_manager::instance();
|
||||
|
||||
foreach ($checks as $check) {
|
||||
$ref = $check->get_ref();
|
||||
$result = $check->get_result();
|
||||
$component = $check->get_component();
|
||||
$actionlink = $check->get_action_link();
|
||||
|
||||
$link = new \moodle_url('/report/security/index.php', ['detail' => $ref]);
|
||||
|
||||
$row = [];
|
||||
$row[] = $OUTPUT->check_result($result);
|
||||
$row[] = $OUTPUT->action_link($link, $check->get_name());
|
||||
|
||||
$row[] = $result->get_summary();
|
||||
if ($actionlink) {
|
||||
$row[] = $OUTPUT->render($actionlink);
|
||||
} else {
|
||||
$row[] = '';
|
||||
}
|
||||
|
||||
$table->data[] = $row;
|
||||
}
|
||||
echo html_writer::table($table);
|
||||
|
||||
if ($detail && $result) {
|
||||
echo $OUTPUT->heading(get_string('description'), 3);
|
||||
echo $OUTPUT->box($result->get_details(), 'generalbox boxwidthnormal boxaligncenter');
|
||||
echo $OUTPUT->continue_button($url);
|
||||
}
|
||||
|
||||
echo $table->render($OUTPUT);
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
$event = \report_security\event\report_viewed::create(['context' => context_system::instance()]);
|
||||
$event->trigger();
|
||||
|
||||
|
48
report/status/classes/privacy/provider.php
Normal file
48
report/status/classes/privacy/provider.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Privacy provider.
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace report_status\privacy;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
/**
|
||||
* Privacy provider.
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function get_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
}
|
||||
}
|
||||
|
37
report/status/db/access.php
Normal file
37
report/status/db/access.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* System status capabilities
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$capabilities = [
|
||||
|
||||
'report/status:view' => [
|
||||
'riskbitmask' => RISK_CONFIG,
|
||||
'captype' => 'read',
|
||||
'contextlevel' => CONTEXT_SYSTEM,
|
||||
'archetypes' => [
|
||||
'manager' => CAP_ALLOW
|
||||
],
|
||||
]
|
||||
];
|
46
report/status/index.php
Normal file
46
report/status/index.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* System Status report
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
define('NO_OUTPUT_BUFFERING', true);
|
||||
|
||||
require('../../config.php');
|
||||
require_once($CFG->libdir.'/adminlib.php');
|
||||
|
||||
admin_externalpage_setup('reportstatus', '', null, '', ['pagelayout' => 'report']);
|
||||
|
||||
$detail = optional_param('detail', '', PARAM_TEXT); // Show detailed info about one check only.
|
||||
|
||||
$url = '/report/status/index.php';
|
||||
$table = new core\check\table('status', $url, $detail);
|
||||
|
||||
if (!empty($table->detail)) {
|
||||
$PAGE->set_docs_path($url . '?detail=' . $detail);
|
||||
$PAGE->navbar->add($table->detail->get_name());
|
||||
}
|
||||
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading(get_string('pluginname', 'report_status'));
|
||||
echo $table->render($OUTPUT);
|
||||
echo $OUTPUT->footer();
|
||||
|
27
report/status/lang/en/report_status.php
Normal file
27
report/status/lang/en/report_status.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Strings for component 'tool_task', language 'en'
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
$string['pluginname'] = 'System status';
|
||||
$string['status:view'] = 'View system status';
|
||||
$string['privacy:metadata'] = 'This plugin does not store any personal data.';
|
30
report/status/settings.php
Normal file
30
report/status/settings.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Plugin version info
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$ADMIN->add('reports', new admin_externalpage('reportstatus', get_string('pluginname', 'report_status'),
|
||||
"$CFG->wwwroot/report/status/index.php", 'report/status:view'));
|
||||
|
||||
$settings = null;
|
30
report/status/version.php
Normal file
30
report/status/version.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Plugin version info
|
||||
*
|
||||
* @package report_status
|
||||
* @copyright 2020 Brendan Heywood (brendan@catalyst-au.net)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2019111800; // The current plugin version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2019111200; // Requires this Moodle version.
|
||||
$plugin->component = 'report_status'; // Full name of the plugin (used for diagnostics).
|
||||
|
Loading…
x
Reference in New Issue
Block a user