From 2ffaa9a6b0bf717d1da5369aa688ad27e1a24ab6 Mon Sep 17 00:00:00 2001
From: lucashedding <lucashedding@1463982.no-reply.drupal.org>
Date: Mon, 8 Jul 2019 10:19:28 -0600
Subject: [PATCH] Issue #3058250 by heddn, catch: Cron frequency

---
 ReadinessCheckers/CronFrequency.php           | 36 +++++++++++++++++++
 ReadinessCheckers/ReadinessCheckerManager.php |  1 +
 automatic_updates.info                        |  1 +
 3 files changed, 38 insertions(+)
 create mode 100644 ReadinessCheckers/CronFrequency.php

diff --git a/ReadinessCheckers/CronFrequency.php b/ReadinessCheckers/CronFrequency.php
new file mode 100644
index 0000000000..16d276c147
--- /dev/null
+++ b/ReadinessCheckers/CronFrequency.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Cron frequency checker.
+ */
+class CronFrequency implements ReadinessCheckerInterface {
+
+  /**
+   * Minimum cron threshold is 3 hours.
+   */
+  const MINIMUM_CRON_INTERVAL = 10800;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function run() {
+    $messages = [];
+    if (variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD) > static::MINIMUM_CRON_INTERVAL) {
+      $messages[] = t('Cron is not set to run frequently enough. <a href="@configure">Configure it</a> to run at least every 3 hours or disable automated cron and run it via an external scheduling system.', [
+        '@configure' => url('admin/config/system/cron'),
+      ]);
+    }
+    // Determine when cron last ran.
+    $cron_last = variable_get('cron_last');
+    if (!is_numeric($cron_last)) {
+      $cron_last = variable_get('install_time', 0);
+    }
+    if (REQUEST_TIME - $cron_last > static::MINIMUM_CRON_INTERVAL) {
+      $messages[] = t('Cron has not run recently. <a href="@configure">Configure it</a> to run at least every 3 hours or disable automated cron and run it via an external scheduling system.', [
+        '@configure' => url('admin/config/system/cron'),
+      ]);
+    }
+    return $messages;
+  }
+
+}
diff --git a/ReadinessCheckers/ReadinessCheckerManager.php b/ReadinessCheckers/ReadinessCheckerManager.php
index b149af9714..a6f25c96a6 100644
--- a/ReadinessCheckers/ReadinessCheckerManager.php
+++ b/ReadinessCheckers/ReadinessCheckerManager.php
@@ -23,6 +23,7 @@ class ReadinessCheckerManager {
    */
   protected static function getCheckers() {
     static::$checkers['warning'][0][] = 'BlacklistPhp72Versions';
+    static::$checkers['warning'][0][] = 'CronFrequency';
     static::$checkers['warning'][0][] = 'FileOwnership';
     static::$checkers['warning'][0][] = 'MissingProjectInfo';
     static::$checkers['warning'][0][] = 'ModifiedFiles';
diff --git a/automatic_updates.info b/automatic_updates.info
index 4640351748..f3a9807857 100644
--- a/automatic_updates.info
+++ b/automatic_updates.info
@@ -11,6 +11,7 @@ files[] = ModifiedFilesService.php
 files[] = ReadinessCheckers/ReadinessCheckerManager.php
 files[] = ReadinessCheckers/ReadinessCheckerInterface.php
 files[] = ReadinessCheckers/BlacklistPhp72Versions.php
+files[] = ReadinessCheckers/CronFrequency.php
 files[] = ReadinessCheckers/DiskSpace.php
 files[] = ReadinessCheckers/FileOwnership.php
 files[] = ReadinessCheckers/MissingProjectInfo.php
-- 
GitLab