View source
<?php
namespace Drupal\automatic_updates;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class CronUpdater implements ContainerInjectionInterface {
public const DISABLED = 'disable';
public const SECURITY = 'security';
public const ALL = 'patch';
protected $updater;
protected $configFactory;
protected $logger;
public function __construct(Updater $updater, ConfigFactoryInterface $config_factory, LoggerChannelFactoryInterface $logger_factory) {
$this->updater = $updater;
$this->configFactory = $config_factory;
$this->logger = $logger_factory
->get('automatic_updates');
}
public static function create(ContainerInterface $container) {
return new static($container
->get('automatic_updates.updater'), $container
->get('config.factory'), $container
->get('logger.factory'));
}
public function handleCron() : void {
$level = $this->configFactory
->get('automatic_updates.settings')
->get('cron');
if ($level === static::DISABLED) {
return;
}
$recommender = new UpdateRecommender();
try {
$recommended_release = $recommender
->getRecommendedRelease(TRUE);
} catch (\Throwable $e) {
$this->logger
->error($e
->getMessage());
return;
}
if ($recommended_release === NULL) {
return;
}
$project = $recommender
->getProjectInfo();
if (empty($project['existing_version'])) {
$this->logger
->error('Unable to determine the current version of Drupal core.');
return;
}
if ($level === static::SECURITY && !$recommended_release
->isSecurityRelease()) {
return;
}
$recommended_version = $recommended_release
->getVersion();
try {
$this->updater
->begin([
'drupal' => $recommended_version,
]);
$this->updater
->stage();
$this->updater
->commit();
$this->updater
->clean();
} catch (\Throwable $e) {
$this->logger
->error($e
->getMessage());
return;
}
$this->logger
->info('Drupal core has been updated from %previous_version to %update_version', [
'%previous_version' => $project['existing_version'],
'%update_version' => $recommended_version,
]);
}
}