View source
<?php
namespace Drupal\monitoring\Plugin\monitoring\SensorPlugin;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\monitoring\Result\SensorResultInterface;
use Drupal\monitoring\SensorPlugin\ExtendedInfoSensorPluginInterface;
use Drupal\monitoring\SensorPlugin\SensorPluginBase;
use Drupal\Core\Entity\DependencyTrait;
class CoreRequirementsSensorPlugin extends SensorPluginBase implements ExtendedInfoSensorPluginInterface {
use DependencyTrait;
protected $requirements;
protected $configurableValueType = FALSE;
public function resultVerbose(SensorResultInterface $result) {
$output = [];
$requirements = $this
->getRequirements($this->sensorConfig
->getSetting('module'));
$excluded_keys = $this->sensorConfig
->getSetting('exclude_keys');
if (empty($excluded_keys)) {
$excluded_keys = array();
}
$rows = [];
foreach ($requirements as $key => $value) {
$value += array(
'severity' => NULL,
);
$row['key'] = $key;
if (in_array($key, $excluded_keys)) {
$row['excluded'] = 'Yes';
}
else {
$row['excluded'] = '';
}
$severity = $value['severity'];
if ($severity == REQUIREMENT_ERROR) {
$severity = 'Error';
}
elseif ($severity == REQUIREMENT_WARNING) {
$severity = 'Warning';
}
else {
$severity = 'OK';
}
$row['severity'] = $severity;
$titles = [];
if (isset($value['title'])) {
$titles[] = $value['title'];
}
if (isset($value['value'])) {
$titles[] = $value['value'];
}
$description = '';
if (isset($value['description'])) {
if (is_array($value['description'])) {
$description = \Drupal::service('renderer')
->renderPlain($value['description']);
}
else {
$description = $value['description'];
}
}
$titles = array_map(function ($title) {
if (is_array($title)) {
$title = \Drupal::service('renderer')
->renderPlain($title);
}
return $title;
}, $titles);
$message = array(
'#type' => 'item',
'#title' => implode(' ', $titles),
'#markup' => $description,
);
$row['message'] = \Drupal::service('renderer')
->renderPlain($message);
$row['actions'] = array();
if (!in_array($key, $excluded_keys)) {
$row['actions']['data'] = array(
'#type' => 'link',
'#title' => $this
->t('Ignore'),
'#url' => Url::fromRoute('monitoring.requirements_sensor_ignore_key', array(
'monitoring_sensor_config' => $this->sensorConfig
->id(),
'key' => $key,
)),
'#access' => \Drupal::currentUser()
->hasPermission('administer monitoring'),
);
}
else {
$row['actions']['data'] = array(
'#type' => 'link',
'#title' => $this
->t('Unignore'),
'#url' => Url::fromRoute('monitoring.requirements_sensor_unignore_key', array(
'monitoring_sensor_config' => $this->sensorConfig
->id(),
'key' => $key,
)),
'#access' => \Drupal::currentUser()
->hasPermission('administer monitoring'),
);
}
$rows[] = array(
'data' => $row,
);
}
if (count($rows) > 0) {
$header = [];
$header['key'] = t('Key');
$header['excluded'] = t('Excluded');
$header['severity'] = t('Severity');
$header['message'] = t('Message');
$header['actions'] = t('Actions');
$output['requirements'] = array(
'#type' => 'verbose_table_result',
'#header' => $header,
'#rows' => $rows,
);
}
return $output;
}
public function runSensor(SensorResultInterface $result) {
$requirements = $this
->getRequirements($this->sensorConfig
->getSetting('module'));
foreach ($this->sensorConfig
->getSetting('exclude_keys', array()) as $exclude_key) {
if (isset($requirements[$exclude_key])) {
unset($requirements[$exclude_key]);
}
}
$this
->processRequirements($result, $requirements);
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state);
$form['exclude_keys'] = array(
'#type' => 'textarea',
'#title' => t('Keys to be excluded.'),
'#description' => t('Seperate the keys by a new line.'),
);
if ($this->sensorConfig
->getSetting('exclude_keys')) {
$form['exclude_keys']['#default_value'] = implode("\n", $this->sensorConfig
->getSetting('exclude_keys'));
}
return $form;
}
protected function getHighestSeverity(&$requirements) {
$severity = REQUIREMENT_INFO;
foreach ($requirements as $requirement) {
if (isset($requirement['severity'])) {
$severity = max($severity, $requirement['severity']);
}
}
return $severity;
}
protected function getRequirements($module) {
module_load_install($module);
$function = $module . '_requirements';
if (!function_exists($function)) {
throw new \RuntimeException(new FormattableMarkup('Requirement function @function not found', array(
'@function' => $function,
)));
}
return (array) $function('runtime');
}
protected function processRequirements(SensorResultInterface $result, $requirements) {
$severity = $this
->getHighestSeverity($requirements);
if ($severity == REQUIREMENT_ERROR) {
$result
->setStatus(SensorResultInterface::STATUS_CRITICAL);
}
elseif ($severity == REQUIREMENT_WARNING) {
$result
->setStatus(SensorResultInterface::STATUS_WARNING);
}
else {
$result
->setStatus(SensorResultInterface::STATUS_OK);
}
if (!empty($requirements)) {
foreach ($requirements as $requirement) {
if (!isset($requirement['severity']) || $requirement['severity'] != $severity) {
continue;
}
if (!empty($requirement['title'])) {
$result
->addStatusMessage($requirement['title']);
}
if (!empty($requirement['description'])) {
$result
->addStatusMessage($requirement['description']);
}
if (!empty($requirement['value'])) {
$result
->addStatusMessage($requirement['value']);
}
}
}
else {
$result
->addStatusMessage('Requirements check OK');
}
}
public function calculateDependencies() {
$module = $this->sensorConfig
->getSetting('module');
$this
->addDependency('module', $module);
return $this->dependencies;
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$keys = array_filter(explode("\n", $form_state
->getValue(array(
'settings',
'exclude_keys',
))));
$keys = array_map('trim', $keys);
$this->sensorConfig->settings['exclude_keys'] = $keys;
}
}