2024-04-22 14:24:04 +02:00
< ? php if ( ! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
2024-04-24 21:35:07 +02:00
class cron extends CI_Controller {
2024-05-08 13:29:43 +02:00
private $min_php_version ;
2024-04-23 01:23:54 +02:00
function __construct () {
2024-04-22 14:24:04 +02:00
parent :: __construct ();
2024-04-22 23:58:35 +02:00
if ( ENVIRONMENT == 'maintenance' && $this -> session -> userdata ( 'user_id' ) == '' ) {
2024-06-08 11:01:59 +02:00
echo __ ( " Maintenance Mode is active. Try again later. " ) . " \n " ;
2024-04-22 23:58:35 +02:00
redirect ( 'user/login' );
2024-04-22 14:24:04 +02:00
}
2024-04-26 00:50:06 +02:00
$this -> load -> model ( 'cron_model' );
2024-05-08 13:29:43 +02:00
// Minimum PHP Version for the Cron Manager
$this -> min_php_version = '8.1.0' ;
2024-04-22 14:24:04 +02:00
}
public function index () {
2024-04-22 23:58:35 +02:00
2024-04-24 21:35:07 +02:00
if ( ! $this -> user_model -> authorize ( 99 )) {
2024-08-16 10:08:44 +02:00
$this -> session -> set_flashdata ( 'error' , __ ( " You're not allowed to do that! " ));
2024-04-24 21:35:07 +02:00
redirect ( 'dashboard' );
}
2024-04-22 23:58:35 +02:00
2024-04-22 14:24:04 +02:00
$this -> load -> helper ( 'file' );
$footerData = [];
2024-04-26 00:50:06 +02:00
$footerData [ 'scripts' ] = [
2026-02-13 16:58:57 +01:00
'assets/js/cronstrue.min.js' ,
'assets/js/sections/cron.js'
2024-04-26 00:50:06 +02:00
];
2024-04-22 14:24:04 +02:00
2024-06-08 11:01:59 +02:00
$data [ 'page_title' ] = __ ( " Cron Manager " );
2024-04-22 14:24:04 +02:00
$data [ 'crons' ] = $this -> cron_model -> get_crons ();
2024-08-21 21:21:26 +02:00
$data [ 'cron_allow_insecure' ] = $this -> config -> item ( 'cron_allow_insecure' ) ? ? false ;
2026-07-16 11:12:23 +02:00
$data [ 'cron_disable_run_now' ] = ( $this -> config -> item ( 'cron_disable_run_now' ) ? ? false ) == true ;
2024-04-22 14:24:04 +02:00
2024-04-26 22:03:59 +02:00
$mastercron = array ();
$mastercron = $this -> get_mastercron_status ();
$data [ 'mastercron' ] = $mastercron ;
2024-05-08 13:29:43 +02:00
$data [ 'min_php_version' ] = $this -> min_php_version ;
2024-04-26 22:03:59 +02:00
2024-04-22 14:24:04 +02:00
$this -> load -> view ( 'interface_assets/header' , $data );
$this -> load -> view ( 'cron/index' );
$this -> load -> view ( 'interface_assets/footer' , $footerData );
}
2024-04-22 23:58:35 +02:00
2024-04-24 17:23:21 +02:00
public function run () {
2024-04-23 01:23:54 +02:00
// This is the main function, which handles all crons, runs them if enabled and writes the 'next run' timestamp to the database
2026-06-08 21:52:31 +02:00
// Rate limit: this function may only be triggered once every minute. To prevent attack vectors we lock the cron runner for 30 seconds after it's last run.
$this -> load -> driver ( 'cache' , [
'adapter' => $this -> config -> item ( 'cache_adapter' ) ? ? 'file' ,
'backup' => $this -> config -> item ( 'cache_backup' ) ? ? 'file' ,
'key_prefix' => $this -> config -> item ( 'cache_key_prefix' ) ? ? ''
]);
2026-07-21 18:28:54 +00:00
$this -> load -> helper ( 'cronauth' );
2026-06-08 21:52:31 +02:00
$rate_limit_key = 'cron_run_rate_limit' ;
if ( $this -> cache -> get ( $rate_limit_key ) !== false ) {
http_response_code ( 429 ); // Too Many Requests
log_message ( 'debug' , 'CRON: run() called within the 30s rate limit window, skipping.' );
echo " CRON: rate limit active, skipping. Try again in a few seconds. \n " ;
return ;
}
// Set the lock for 30 seconds
$this -> cache -> save ( $rate_limit_key , time (), 30 );
2024-05-08 13:29:43 +02:00
// check for min. PHP version
if ( version_compare ( PHP_VERSION , $this -> min_php_version ) >= 0 ) {
2024-04-23 10:50:57 +02:00
2024-05-08 13:29:43 +02:00
// TODO Add an API Key to the cronjob to improve security?
2024-04-23 01:23:54 +02:00
2024-05-08 13:29:43 +02:00
$crons = $this -> cron_model -> get_crons ();
2024-04-26 00:50:06 +02:00
2024-05-08 13:29:43 +02:00
$status = 'pending' ;
2024-04-23 01:23:54 +02:00
2024-05-08 13:29:43 +02:00
foreach ( $crons as $cron ) {
2024-08-27 07:53:41 +02:00
// Set the status to false by default
$set_status = false ;
2026-07-21 18:28:54 +00:00
cronauth_mark_active ();
2026-03-28 22:58:51 +01:00
try {
if ( $cron -> enabled == 1 ) {
// calculate the crons expression
$data = array (
'expression' => $cron -> expression ,
'timeZone' => new DateTimeZone ( 'UTC' )
);
$this -> load -> library ( 'CronExpression' , $data );
$cronjob = $this -> cronexpression ;
$dt = new DateTime ();
$isdue = $cronjob -> isMatching ( $dt );
// Set the status to true, if the cron is enabled by default
$set_status = true ;
$next_run = $cronjob -> getNext ();
2026-03-28 23:23:29 +01:00
$next_run_date = gmdate ( 'Y-m-d H:i:s' , $next_run );
2026-03-28 22:58:51 +01:00
$this -> cron_model -> set_next_run ( $cron -> id , $next_run_date );
if ( $isdue == true ) {
$isdue_result = 'true' ;
log_message ( 'debug' , 'CRON: ' . $cron -> id . ' is due and will be executed.' );
echo " CRON: " . $cron -> id . " -> is due: " . $isdue_result . " \n " ;
echo " CRON: " . $cron -> id . " -> RUNNING... \n " ;
2026-07-12 12:01:55 -06:00
$cron_result = $this -> triggerCron ( $cron );
2026-03-28 22:58:51 +01:00
if ( ENVIRONMENT == " development " ) {
2026-07-12 12:01:55 -06:00
echo " CRON: " . $cron -> id . " -> URL: " . $cron_result [ 'url' ] . " \n " ;
2026-03-28 22:58:51 +01:00
}
2026-07-12 12:01:55 -06:00
if ( $cron_result [ 'locked' ]) {
echo " CRON: " . $cron -> id . " -> already running. skipped. \n " ;
$set_status = false ;
} else if ( $cron_result [ 'success' ]) {
echo " CRON: " . $cron -> id . " -> CURL Result: " . $cron_result [ 'response' ] . " \n " ;
2026-03-28 22:58:51 +01:00
$status = 'healthy' ;
} else {
2026-07-12 12:01:55 -06:00
echo " ERROR: Something went wrong with " . $cron -> id . " ; Message: " . $cron_result [ 'error' ] . " \n " ;
2026-03-28 22:58:51 +01:00
$status = 'failed' ;
}
2025-08-03 21:46:22 +02:00
} else {
2026-03-28 22:58:51 +01:00
$isdue_result = 'false' ;
echo " CRON: " . $cron -> id . " -> is due: " . $isdue_result . " -> Next Run: " . $next_run_date . " \n " ;
2024-05-08 13:29:43 +02:00
$status = 'healthy' ;
2026-03-28 22:58:51 +01:00
// Don't set the status as the cronjob is not due
$set_status = false ;
2024-05-08 13:29:43 +02:00
}
2024-04-23 01:23:54 +02:00
} else {
2026-03-28 22:58:51 +01:00
echo 'CRON: ' . $cron -> id . " is disabled. skipped.. \n " ;
$status = 'disabled' ;
// Set the status if the cron needs to be disabled.
$set_status = true ;
2024-04-23 01:23:54 +02:00
2026-03-28 22:58:51 +01:00
// Set the next_run timestamp to null to indicate in the view/database that this cron is disabled
$this -> cron_model -> set_next_run ( $cron -> id , null );
}
if ( $set_status == true ) {
$this -> cron_model -> set_status ( $cron -> id , $status );
}
$this -> cronexpression = null ;
} catch ( Exception $e ) {
log_message ( 'error' , 'CRON: ' . $cron -> id . ' failed: ' . $e -> getMessage ());
echo " ERROR: CRON " . $cron -> id . " failed: " . $e -> getMessage () . " \n " ;
$this -> cron_model -> set_status ( $cron -> id , 'failed' );
2024-08-23 08:50:10 +02:00
}
2024-04-23 01:23:54 +02:00
}
2024-04-26 22:03:59 +02:00
2024-05-08 13:29:43 +02:00
$datetime = new DateTime ( " now " , new DateTimeZone ( 'UTC' ));
2026-03-28 22:58:51 +01:00
$datetime = $datetime -> format ( 'Y-m-d H:i:s' );
2024-05-08 13:29:43 +02:00
$this -> optionslib -> update ( 'mastercron_last_run' , $datetime , 'no' );
} else {
log_message ( 'error' , 'CRON: PHP Version ' . PHP_VERSION . ' not supported. Minimum Version is: ' . $this -> min_php_version );
echo 'CRON: PHP Version ' . PHP_VERSION . ' not supported. Minimum Version is: ' . $this -> min_php_version . " \n " ;
}
2024-04-24 17:23:21 +02:00
}
2024-04-25 16:37:17 +02:00
2026-07-12 12:01:55 -06:00
public function runNow () {
if ( ! $this -> user_model -> authorize ( 99 )) {
header ( " Content-type: application/json " );
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => __ ( " You're not allowed to do that! " )]);
return ;
}
2026-07-16 11:12:23 +02:00
if (( $this -> config -> item ( 'cron_disable_run_now' ) ? ? false ) == true ) {
header ( " Content-type: application/json " );
echo json_encode ([ 'success' => false , 'messagecategory' => 'warning' , 'message' => __ ( 'Manual execution of cronjobs is disabled.' )]);
return ;
}
2026-07-15 12:19:23 -06:00
// Release the session lock: the job runs synchronously and would otherwise
// block every other request of this user (with the file session driver) until it finishes.
session_write_close ();
2026-07-12 12:01:55 -06:00
$cron = $this -> cron_model -> cron ( $this -> input -> post ( 'id' , true )) -> row ();
if ( $cron === null ) {
header ( " Content-type: application/json " );
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => __ ( 'Cronjob not found.' )]);
return ;
}
if ( $cron -> enabled != 1 ) {
header ( " Content-type: application/json " );
echo json_encode ([ 'success' => false , 'messagecategory' => 'warning' , 'message' => __ ( 'Disabled cronjobs cannot be run.' )]);
return ;
}
$cron_result = $this -> triggerCron ( $cron );
header ( " Content-type: application/json " );
if ( $cron_result [ 'locked' ]) {
echo json_encode ([ 'success' => false , 'messagecategory' => 'warning' , 'message' => __ ( 'Cronjob is already running.' )]);
return ;
}
if ( $cron_result [ 'success' ]) {
2026-07-16 11:16:00 +02:00
$this -> cron_model -> set_status ( $cron -> id , 'healthy' );
2026-07-16 10:58:28 +02:00
echo json_encode ([ 'success' => true , 'messagecategory' => 'success' , 'message' => __ ( 'Cronjob executed successfully.' )]);
2026-07-12 12:01:55 -06:00
} else {
2026-07-16 11:16:00 +02:00
$this -> cron_model -> set_status ( $cron -> id , 'failed' );
2026-07-12 12:01:55 -06:00
log_message ( 'error' , 'CRON: Manual execution of ' . $cron -> id . ' failed: ' . $cron_result [ 'error' ]);
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => __ ( 'Cronjob execution failed.' )]);
}
}
2024-04-25 16:37:17 +02:00
public function editDialog () {
2026-06-08 21:44:29 +02:00
if ( ! $this -> user_model -> authorize ( 99 )) {
$this -> session -> set_flashdata ( 'error' , __ ( " You're not allowed to do that! " ));
redirect ( 'dashboard' );
}
$cron_query = $this -> cron_model -> cron ( $this -> input -> post ( 'id' , true ));
2024-04-25 16:37:17 +02:00
2024-04-26 10:50:37 +02:00
$data [ 'cron' ] = $cron_query -> row ();
2024-06-08 11:01:59 +02:00
$data [ 'page_title' ] = __ ( " Edit Cronjob " );
2024-04-25 16:37:17 +02:00
$this -> load -> view ( 'cron/edit' , $data );
}
2024-04-26 00:50:06 +02:00
2024-04-26 13:53:13 +02:00
public function edit () {
if ( ! $this -> user_model -> authorize ( 99 )) {
2024-08-16 10:08:44 +02:00
$this -> session -> set_flashdata ( 'error' , __ ( " You're not allowed to do that! " ));
2024-04-26 13:53:13 +02:00
redirect ( 'dashboard' );
}
2026-06-08 21:44:29 +02:00
$id = $this -> input -> post ( 'cron_id' , true );
$description = $this -> input -> post ( 'cron_description' , true );
$expression = $this -> input -> post ( 'cron_expression' , true );
$enabled = $this -> input -> post ( 'cron_enabled' , true );
2024-04-26 13:53:13 +02:00
2024-04-26 18:48:54 +02:00
$data = array (
'expression' => $expression ,
2026-03-28 22:58:51 +01:00
'timeZone' => new DateTimeZone ( 'UTC' )
2024-04-26 18:48:54 +02:00
);
$this -> load -> library ( 'CronExpression' , $data );
$cron = $this -> cronexpression ;
if ( $cron -> isValid ()) {
$this -> cron_model -> edit_cron ( $id , $description , $expression , $enabled );
$this -> cronexpression = null ;
header ( " Content-type: application/json " );
2024-04-26 18:58:38 +02:00
echo json_encode ([ 'success' => true , 'messagecategory' => 'success' , 'message' => 'Changes saved for Cronjob "' . $id . '"' ]);
2024-04-26 18:48:54 +02:00
} else {
$this -> session -> set_flashdata ( 'error' , 'The Cron Expression you entered is not valid' );
$this -> cronexpression = null ;
header ( " Content-type: application/json " );
2024-04-26 18:58:38 +02:00
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => 'The expression "' . $expression . '" is not valid. Please try again.' ]);
2024-04-26 18:48:54 +02:00
}
2024-04-26 13:53:13 +02:00
}
2024-04-26 00:50:06 +02:00
public function toogleEnableCronSwitch () {
2026-06-07 09:35:34 +02:00
if ( ! $this -> user_model -> authorize ( 99 )) {
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => 'Not allowed' ]);
return ;
}
2024-04-26 00:50:06 +02:00
2026-06-07 09:35:34 +02:00
$id = $this -> input -> post ( 'id' , true );
$cron_enabled = $this -> input -> post ( 'checked' , true );
2024-04-26 00:50:06 +02:00
if ( $id ? ? '' != '' ) {
2024-04-26 18:58:38 +02:00
$this -> cron_model -> set_cron_enabled ( $id , $cron_enabled );
$data [ 'success' ] = 1 ;
2024-04-26 00:50:06 +02:00
} else {
2024-04-26 18:58:38 +02:00
$data [ 'success' ] = 0 ;
$data [ 'flashdata' ] = 'Not allowed' ;
2024-04-26 00:50:06 +02:00
}
echo json_encode ( $data );
}
public function fetchCrons () {
2026-06-08 21:44:29 +02:00
if ( ! $this -> user_model -> authorize ( 99 )) {
echo json_encode ([ 'success' => false , 'messagecategory' => 'error' , 'message' => 'Not allowed' ]);
return ;
}
2024-04-26 18:58:38 +02:00
$hres = [];
2024-04-26 00:50:06 +02:00
$result = $this -> cron_model -> get_crons ();
foreach ( $result as $cron ) {
$single = ( object ) [];
$single -> cron_id = $cron -> id ;
$single -> cron_description = $cron -> description ;
$single -> cron_status = $this -> cronStatus2html ( $cron -> enabled , $cron -> status );
$single -> cron_expression = $this -> cronExpression2html ( $cron -> expression );
2024-11-04 21:25:10 +01:00
$single -> cron_last_run = $cron -> last_run ? ? __ ( " never " );
$single -> cron_next_run = ( $cron -> enabled == '1' ) ? ( $cron -> next_run ? ? __ ( " calculating... " )) : __ ( " never " );
2024-04-26 00:50:06 +02:00
$single -> cron_edit = $this -> cronEdit2html ( $cron -> id );
2026-07-12 12:01:55 -06:00
$single -> cron_run = $this -> cronRun2html ( $cron -> id , $cron -> enabled );
2024-04-26 00:50:06 +02:00
$single -> cron_enabled = $this -> cronEnabled2html ( $cron -> id , $cron -> enabled );
array_push ( $hres , $single );
2024-04-26 18:58:38 +02:00
}
2024-04-26 00:50:06 +02:00
echo json_encode ( $hres );
}
private function cronStatus2html ( $enabled , $status ) {
2024-04-26 18:58:38 +02:00
if ( $enabled == '1' ) {
2024-04-26 00:50:06 +02:00
if ( $status == 'healthy' ) {
2024-11-04 21:25:10 +01:00
$htmlret = '<span class="badge text-bg-success">' . __ ( " healthy " ) . '</span>' ;
} else if ( $status == 'failed' ) {
$htmlret = '<span class="badge text-bg-danger">' . __ ( " failed " ) . '</span>' ;
} else if ( $status == 'pending' ) {
$htmlret = '<span class="badge text-bg-warning">' . __ ( " pending " ) . '</span>' ;
2024-04-26 00:50:06 +02:00
} else {
2024-04-26 18:58:38 +02:00
$htmlret = '<span class="badge text-bg-warning">' . $status . '</span>' ;
2024-04-26 00:50:06 +02:00
}
} else {
2024-11-04 21:25:10 +01:00
$htmlret = '<span class="badge text-bg-secondary">' . __ ( " disabled " ) . '</span>' ;
2024-04-26 00:50:06 +02:00
}
return $htmlret ;
}
private function cronExpression2html ( $expression ) {
2024-04-26 18:58:38 +02:00
$htmlret = '<code id="humanreadable_tooltip" data-bs-toggle="tooltip">' . $expression . '</code>' ;
2024-04-26 00:50:06 +02:00
return $htmlret ;
}
private function cronEdit2html ( $id ) {
2024-04-26 18:58:38 +02:00
$htmlret = '<button id="' . $id . '" class="editCron btn btn-outline-primary btn-sm"><i class="fas fa-edit"></i></button>' ;
2024-04-26 00:50:06 +02:00
return $htmlret ;
}
2026-07-12 12:01:55 -06:00
private function cronRun2html ( $id , $enabled ) {
$disabled = ( $enabled == '1' ) ? '' : ' disabled' ;
$htmlret = '<button id="' . $id . '" class="runCron btn btn-outline-success btn-sm"' . $disabled . '>' . __ ( " Run Now " ) . '</button>' ;
return $htmlret ;
}
2024-04-26 00:50:06 +02:00
private function cronEnabled2html ( $id , $enabled ) {
if ( $enabled == '1' ) {
$checked = 'checked' ;
} else {
$checked = '' ;
}
2024-04-26 18:58:38 +02:00
$htmlret = '<div class="form-check form-switch"><input name="cron_enable_switch" class="form-check-input enableCronSwitch" type="checkbox" role="switch" id="' . $id . '" ' . $checked . '></div>' ;
2024-04-26 00:50:06 +02:00
return $htmlret ;
}
2024-04-26 22:03:59 +02:00
2026-07-12 12:01:55 -06:00
private function triggerCron ( $cron ) {
2026-07-21 18:28:54 +00:00
$this -> load -> helper ( 'cronauth' );
$cron_token = cronauth_token ();
2026-07-12 12:01:55 -06:00
if ( ENVIRONMENT == " docker " ) {
$url = 'http://localhost/' . $cron -> function ;
log_message ( 'debug' , 'Docker Environment detected. Using URL: ' . $url );
} else {
$url = local_url () . $cron -> function ;
}
// Prevent manual and scheduled executions of the same cronjob from overlapping.
2026-07-15 12:19:23 -06:00
// Load cache driver for locking mechanism.
$this -> load -> driver ( 'cache' , [
'adapter' => $this -> config -> item ( 'cache_adapter' ) ? ? 'file' ,
'backup' => $this -> config -> item ( 'cache_backup' ) ? ? 'file' ,
'key_prefix' => $this -> config -> item ( 'cache_key_prefix' ) ? ? ''
]);
$lock_key = 'cron_lock_' . md5 ( $cron -> id );
if ( $this -> cache -> get ( $lock_key )) {
2026-07-12 12:01:55 -06:00
return [ 'success' => false , 'locked' => true , 'response' => '' , 'error' => '' , 'url' => $url ];
}
2026-07-16 10:47:15 +02:00
// we lock only for 3 minutes since the curl progressfunction renews the lock by itself every 30s
$lock_ttl = 180 ;
$this -> cache -> save ( $lock_key , time (), $lock_ttl );
2026-07-15 12:19:23 -06:00
2026-07-12 12:01:55 -06:00
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
curl_setopt ( $ch , CURLOPT_USERAGENT , 'Wavelog Updater' );
2026-07-21 18:28:54 +00:00
if ( $cron_token !== '' ) {
curl_setopt ( $ch , CURLOPT_HTTPHEADER , [ 'X-Wavelog-Auth: ' . $cron_token ]);
}
2026-07-12 12:01:55 -06:00
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2026-07-16 11:45:50 +02:00
curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , 15 );
2026-07-16 10:47:15 +02:00
$last_renew = time ();
curl_setopt ( $ch , CURLOPT_NOPROGRESS , false );
curl_setopt ( $ch , CURLOPT_PROGRESSFUNCTION , function ( $ch , $dltotal , $dlnow , $ultotal , $ulnow ) use ( $lock_key , $lock_ttl , & $last_renew ) {
// make sure the progressfunction is called not more than once every 30s
if ( time () - $last_renew >= 30 ) {
$this -> cache -> save ( $lock_key , time (), $lock_ttl );
$last_renew = time ();
}
return 0 ;
});
2026-07-12 12:01:55 -06:00
if ( $this -> config -> item ( 'cron_allow_insecure' ) ? ? false == true ) {
curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST , false );
}
$response = curl_exec ( $ch );
$error = $response === false ? curl_error ( $ch ) : '' ;
2026-07-15 12:19:23 -06:00
// invalidate the cache so the job can run next time
$this -> cache -> delete ( $lock_key );
2026-07-12 12:01:55 -06:00
return [
'success' => $response !== false ,
'locked' => false ,
'response' => $response ,
'error' => $error ,
'url' => $url
];
}
2024-04-26 22:03:59 +02:00
private function get_mastercron_status () {
$warning_timelimit_seconds = 120 ; // yellow - warning please check
$error_timelimit_seconds = 600 ; // red - "not running"
2026-06-07 09:35:34 +02:00
2024-04-26 22:03:59 +02:00
$result = array ();
2026-06-07 09:35:34 +02:00
2024-04-26 22:03:59 +02:00
$last_run = $this -> optionslib -> get_option ( 'mastercron_last_run' ) ? ? null ;
2026-06-07 09:35:34 +02:00
2024-04-26 22:03:59 +02:00
if ( $last_run != null ) {
2026-03-28 22:58:51 +01:00
$timestamp_last_run = DateTime :: createFromFormat ( 'Y-m-d H:i:s' , $last_run , new DateTimeZone ( 'UTC' ));
2026-06-07 09:35:34 +02:00
$now = new DateTime ();
$diff = $now -> getTimestamp () - $timestamp_last_run -> getTimestamp ();
2024-04-26 22:03:59 +02:00
if ( $diff >= 0 && $diff <= $warning_timelimit_seconds ) {
2024-08-21 17:16:10 +02:00
$result [ 'status' ] = __ ( " OK " );
2024-04-26 22:03:59 +02:00
$result [ 'status_class' ] = 'success' ;
} else {
if ( $diff <= $error_timelimit_seconds ) {
2024-08-21 21:50:46 +02:00
$result [ 'status' ] = sprintf ( __ ( " Last run occurred more than %s seconds ago.%sPlease check your master cron! It should run every minute (* * * * *). " ), $warning_timelimit_seconds , '<br>' );
2024-04-26 22:03:59 +02:00
$result [ 'status_class' ] = 'warning' ;
} else {
2024-08-21 21:50:46 +02:00
$result [ 'status' ] = sprintf ( __ ( " Last run occurred more than %s minutes ago.%sSeems like your Mastercron isn't running!%sIt should run every minute (* * * * *). " ), ( $error_timelimit_seconds / 60 ), '<br>' , '<br>' );
2024-04-26 22:03:59 +02:00
$result [ 'status_class' ] = 'danger' ;
}
}
} else {
2024-08-21 17:16:10 +02:00
$result [ 'status' ] = _pgettext ( " Master Cron " , " Not running " );
2024-04-26 22:03:59 +02:00
$result [ 'status_class' ] = 'danger' ;
}
2026-06-07 09:35:34 +02:00
2024-04-26 22:03:59 +02:00
return $result ;
}
2026-06-07 09:35:34 +02:00
2024-04-22 14:24:04 +02:00
}