Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 3.9.x will end* 10 May 2021 (12 months).
  • Bug fixes for security issues in 3.9.x will end* 8 May 2023 (36 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * CLI tool for system checks
  19   *
  20   * @package    core
  21   * @category   check
  22   * @copyright  2020 Brendan Heywood (brendan@catalyst-au.net)
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  define('CLI_SCRIPT', true);
  27  
  28  require(__DIR__ . '/../../config.php');
  29  require_once($CFG->libdir.'/clilib.php');
  30  
  31  use core\check\result;
  32  
  33  list($options, $unrecognized) = cli_get_params([
  34      'help'    => false,
  35      'filter'  => '',
  36      'type'    => 'status',
  37      'verbose' => false,
  38  ], [
  39      'h' => 'help',
  40      'f' => 'filter',
  41      'v' => 'verbose',
  42      't' => 'type',
  43  ]);
  44  
  45  if ($unrecognized) {
  46      $unrecognized = implode("\n  ", $unrecognized);
  47      cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
  48  }
  49  
  50  $checks = \core\check\manager::get_checks($options['type']);
  51  $types = join(', ', \core\check\manager::TYPES);
  52  
  53  $help = "Run Moodle system checks
  54  
  55  Options:
  56   -h, --help      Print out this help
  57   -f, --filter    Filter to a subset of checks
  58   -t, --type      Which set of checks? Defaults to 'status'
  59                   One of $types
  60   -v, --verbose   Show details of all checks, not just failed checks
  61  
  62  Example:
  63  
  64    sudo -u www-data php admin/cli/checks.php
  65    sudo -u www-data php admin/cli/checks.php -v
  66    sudo -u www-data php admin/cli/checks.php -v --filter=environment
  67  
  68  ";
  69  
  70  if ($options['help']) {
  71      echo $help;
  72      die();
  73  }
  74  
  75  $filter = $options['filter'];
  76  if ($filter) {
  77      $checks = array_filter($checks, function($check, $key) use ($filter) {
  78          $ref = $check->get_ref();
  79          return (strpos($ref, $filter) !== false);
  80      }, 1);
  81  }
  82  
  83  // These shell exit codes and labels align with the NRPE standard.
  84  $exitcodes = [
  85      result::NA        => 0,
  86      result::OK        => 0,
  87      result::INFO      => 0,
  88      result::UNKNOWN   => 3,
  89      result::WARNING   => 1,
  90      result::ERROR     => 2,
  91      result::CRITICAL  => 2,
  92  ];
  93  $exitlabel = [
  94      result::NA        => 'OK',
  95      result::OK        => 'OK',
  96      result::INFO      => 'OK',
  97      result::UNKNOWN   => 'UNKNOWN',
  98      result::WARNING   => 'WARNING',
  99      result::ERROR     => 'CRITICAL',
 100      result::CRITICAL  => 'CRITICAL',
 101  ];
 102  
 103  $format = "%      10s| % -60s\n";
 104  $spacer = "----------+--------------------------------------------------------------------\n";
 105  $prefix = '          |';
 106  
 107  $output = '';
 108  $header = $exitlabel[result::OK] . ': ' . get_string('checksok', '', $options['type']) . "\n";
 109  $exitcode = $exitcodes[result::OK];
 110  
 111  foreach ($checks as $check) {
 112      $ref = $check->get_ref();
 113      $result = $check->get_result();
 114  
 115      $status = $result->get_status();
 116      $checkexitcode = $exitcodes[$status];
 117  
 118      // Summary is treated as html.
 119      $summary = $result->get_summary();
 120      $summary = html_to_text($summary, 60, false);
 121  
 122      if ($checkexitcode > $exitcode) {
 123          $exitcode = $checkexitcode;
 124          $header = $exitlabel[$status] . ': ' . $check->get_name() . " (" . $check->get_ref() . ")\n";
 125      }
 126  
 127      if (empty($messages[$status])) {
 128          $messages[$status] = $result;
 129      }
 130  
 131      $len = strlen(get_string('status' . $status));
 132  
 133      if ($options['verbose'] ||
 134          $status == result::WARNING ||
 135          $status == result::CRITICAL ||
 136          $status == result::ERROR) {
 137  
 138          $output .= sprintf(
 139              $format,
 140              $OUTPUT->check_result($result),
 141              sprintf('%s (%s)', $check->get_name(), $ref)
 142          );
 143  
 144          $summary = str_replace("\n", "\n" . $prefix . '     ', $summary);
 145          $output .= sprintf( $format, '', '    ' . $summary);
 146  
 147          if ($options['verbose']) {
 148              $actionlink = $check->get_action_link();
 149              if ($actionlink) {
 150                  $output .= sprintf( $format, '', '    ' . $actionlink->url);
 151              }
 152              $output .= sprintf( $format, '', '');
 153          }
 154      }
 155  }
 156  
 157  // Print NRPE header.
 158  print $header;
 159  
 160  // Only show the table header if there is anything to show.
 161  if ($output) {
 162      print sprintf($format,
 163          get_string('status'). ' ',
 164          get_string('check')
 165      ) .  $spacer;
 166      print $output;
 167  }
 168  
 169  // NRPE shell exit code.
 170  exit($exitcode);
 171