diff --git a/cron.php b/cron.php index 168673ace..9d5c08d9a 100644 --- a/cron.php +++ b/cron.php @@ -1,220 +1,29 @@ -#!/usr/bin/php -q filter($_GET['token']); - } - else - { - $pwd = str_replace('token=','',$pwd); - } - - if(($pref['e_cron_pwd'] != $pwd) || empty($pref['e_cron_pwd'])) - { - - if(!empty($pwd)) - { - require_once(e_HANDLER."mail.php"); - - $message = "Your Cron Schedule is not configured correctly. Your passwords do not match. -

- Sent from cron: ".$pwd."
- Stored in e107: ".$pref['e_cron_pwd']."

- You should regenerate the cron command in admin and enter it again in your server configuration. - "; - - $message .= "

Debug Info

"; - $message .= "

_SERVER

"; - $message .= print_a($_SERVER,true); - $message .= "

_ENV

"; - $message .= print_a($_ENV,true); - $message .= "

_GET

"; - $message .= print_a($_GET,true); - - sendemail($pref['siteadminemail'], "e107 - Cron Schedule Misconfigured.", $message, $pref['siteadmin'],$pref['siteadminemail'], $pref['siteadmin']); - } - - exit; - } - - -// e107::getCache()->CachePageMD5 = '_'; -@file_put_contents(e_CACHE.'cronLastLoad.php',time()); - - - -// from the plugin directory: -// realpath(dirname(__FILE__)."/../../")."/"; - - $list = array(); - - $sql = e107::getDb(); - if($sql->select("cron",'cron_function,cron_tab','cron_active =1')) - { - while($row = $sql->fetch()) - { - list($class,$function) = explode("::",$row['cron_function'],2); - $key = $class."__".$function; - - $list[$key] = array( - 'path' => $class, - 'active' => 1, - 'tab' => $row['cron_tab'], - 'function' => $function, - 'class' => $class - ); - } - } - - - // foreach($pref['e_cron_pref'] as $func=>$cron) - // { - // if($cron['active']==1) - // { - // $list[$func] = $cron; - // } - // } - - - -if($_E107['debug'] && $_SERVER['QUERY_STRING']) -{ - echo "

Cron Lists

"; - print_a($list); -} - -require_once(e_HANDLER."cron_class.php"); - - -$cron = new CronParser(); - -require_once(e_HANDLER."mail.php"); -foreach($list as $func=>$val) -{ - $cron->calcLastRan($val['tab']); - $due = $cron->getLastRanUnix(); - - if($_E107['debug']) - { - echo "
Cron: ".$val['function']; - } - - if($due > (time()-45)) - { - if($_E107['debug']) { echo "
Running Now...
path: ".$val['path']; } - - if(($val['path']=='_system') || is_readable(e_PLUGIN.$val['path']."/e_cron.php")) - { - if($val['path'] != '_system') // this is correct. - { - include_once(e_PLUGIN.$val['path']."/e_cron.php"); - } - - $classname = $val['class']."_cron"; - if(class_exists($classname, false)) - { - $obj = new $classname; - if(method_exists($obj,$val['function'])) - { - // $mes->add("Executing config function ".$key." : ".$method_name."()", E_MESSAGE_DEBUG); - if($_E107['debug']) { echo "
Method Found: ".$classname."::".$val['function']."()"; } - - // Exception handling - $methodname = $val['function']; - $status = false; - try - { - $status = $obj->$methodname(); - } - catch (Exception $e) - { - $errorMData = $e->getFile().' '.$e->getLine(); - $errorMData .= "\n\n".$e->getCode().''.$e->getMessage(); - $errorMData .= "\n\n".implode("\n", $e->getTrace()); - //TODO log error in admin log. Pref for sending email to Administator - sendemail($pref['siteadminemail'], $pref['siteadmin'].": Cron Schedule Exception", $errorMData, $pref['siteadmin'],$pref['siteadminemail'], $pref['siteadmin']); - } - // $status = call_user_func(array($obj,$val['function'])); - - // If task returns value which is not boolean (bc), it'll be used as a message (send email, logs) - if($status && true !== $status) - { - //TODO log error in admin log. Pref for sending email to Administator - // echo "\nerror running the function ".$func.".\n"; // log the error. - if($_E107['debug']) { echo "
Method returned message: [{$classname}::".$val['function'].'] '.$status; } - sendemail($pref['siteadminemail'], $pref['siteadmin'].": Cron Schedule Task Report", "Method returned message: [{$classname}::".$val['function'].'] '.$status, $pref['siteadmin'], $pref['siteadminemail'], $pref['siteadmin']); - } - } - else - { - if($_E107['debug']) { echo "
Couldn't find method: ".$val['function']; } - } - } - else - { - if($_E107['debug']) { echo "
Couldn't find class: ".$classname; } - } - - } - } - // echo "Cron Unix = ". $cron->getLastRanUnix(); - // echo "
Now = ".time(); - -} - - - - - -// echo "
Cron '$cron_str0' last due at: " . date('r', $cron->getLastRanUnix()) . "

"; -// $cron->getLastRan() returns last due time in an array -// print_a($cron->getLastRan()); -// echo "Debug:
" . nl2br($cron->getDebug()); - /* -$cron_str1 = "3 12 * * *"; -if ($cron->calcLastRan($cron_str1)) -{ - echo "

Cron '$cron_str1' last due at: " . date('r', $cron->getLastRanUnix()) . "

"; - print_r($cron->getLastRan()); -} -else -{ - echo "Error parsing"; -} -echo "Debug:
" . nl2br($cron->getDebug()); -*/ - -exit; -?> \ No newline at end of file +$cron = new cronScheduler(); +$cron->run(); diff --git a/e107_handlers/cron_class.php b/e107_handlers/cron_class.php index 95b302cc9..01198e1ce 100644 --- a/e107_handlers/cron_class.php +++ b/e107_handlers/cron_class.php @@ -920,4 +920,323 @@ class CronParser } } -?> \ No newline at end of file + + +/** + * Class cronScheduler. + * + * @see cron.php + * + * TODO: + * - Log error in admin log. + * - Pref for sending email to Administrator. + * - LANs + */ +class cronScheduler +{ + + /** + * Cron parser class. + * + * @var \CronParser. + */ + private $cron; + + /** + * Debug mode. + * + * @var bool + */ + private $debug; + + /** + * System preferences. + * + * @var array|mixed + */ + private $pref; + + /** + * Constructor. + */ + public function __construct() + { + global $_E107, $pref; + + $this->cron = new CronParser(); + $this->debug = $_E107['debug']; + $this->pref = $pref; + } + + /** + * Runs all cron jobs. + * + * @return bool + */ + public function run() + { + $valid = $this->validateToken(); + + if(!$valid) + { + return false; + } + + @file_put_contents(e_CACHE . 'cronLastLoad.php', time()); + + // Get active cron jobs. + $cron_jobs = $this->getCronJobs(true); + + if($this->debug && $_SERVER['QUERY_STRING']) + { + echo "

Cron Lists

"; + print_a($cron_jobs); + } + + foreach($cron_jobs as $job) + { + $this->runJob($job); + } + } + + /** + * Runs a cron job. + * + * @param array $job + * Contains the current cron job. Each element is an array with following + * properties: + * - 'path' string '_system' or plugin name. + * - 'active' int 1 if active, 0 if inactive + * - 'tab' string cron tab + * - 'function' string function name + * - 'class' string class name + * + * @return bool + */ + public function runJob($job) + { + if(empty($job['active'])) + { + return false; + } + + // Calculate the last due time before this moment. + $this->cron->calcLastRan($job['tab']); + $due = $this->cron->getLastRanUnix(); + + if($this->debug) + { + echo "
Cron: " . $job['function']; + } + + if($due <= (time() - 45)) + { + return false; + } + + if($job['path'] != '_system' && !is_readable(e_PLUGIN . $job['path'] . "/e_cron.php")) + { + return false; + } + + if($this->debug) + { + echo "
Running Now...
path: " . $job['path']; + } + + // This is correct. + if($job['path'] != '_system') + { + include_once(e_PLUGIN . $job['path'] . "/e_cron.php"); + } + + $class = $job['class'] . "_cron"; + + if(!class_exists($class, false)) + { + if($this->debug) + { + echo "
Couldn't find class: " . $class; + } + + return false; + } + + $obj = new $class; + + if(!method_exists($obj, $job['function'])) + { + if($this->debug) + { + echo "
Couldn't find method: " . $job['function']; + } + + return false; + } + + if($this->debug) + { + echo "
Method Found: " . $class . "::" . $job['function'] . "()"; + } + + // Exception handling. + $method = $job['function']; + $status = false; + + try + { + $status = $obj->$method(); + } catch(Exception $e) + { + $msg = $e->getFile() . ' ' . $e->getLine(); + $msg .= "\n\n" . $e->getCode() . '' . $e->getMessage(); + $msg .= "\n\n" . implode("\n", $e->getTrace()); + + $mail = array( + 'to_mail' => $this->pref['siteadminemail'], + 'to_name' => $this->pref['siteadmin'], + 'from_mail' => $this->pref['siteadminemail'], + 'from_name' => $this->pref['siteadmin'], + 'message' => $msg, + 'subject' => 'e107 - Cron Schedule Exception', + ); + + $this->sendMail($mail); + } + + // If task returns value which is not boolean (BC), it will be used as a + // message (send email, logs). + if($status && true !== $status) + { + if($this->debug) + { + echo "
Method returned message: [{$class}::" . $job['function'] . '] ' . $status; + } + + $msg = 'Method returned message: [{' . $class . '}::' . $job['function'] . '] ' . $status; + + $mail = array( + 'to_mail' => $this->pref['siteadminemail'], + 'to_name' => $this->pref['siteadmin'], + 'from_mail' => $this->pref['siteadminemail'], + 'from_name' => $this->pref['siteadmin'], + 'message' => $msg, + 'subject' => 'e107 - Cron Schedule Task Report', + ); + + $this->sendMail($mail); + } + + return true; + } + + /** + * Validate Cron Token. + * + * @return bool + */ + public function validateToken() + { + $pwd = ($this->debug && $_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : trim($_SERVER['argv'][1]); + + if(!empty($_GET['token'])) + { + $pwd = e107::getParser()->filter($_GET['token']); + } + else + { + $pwd = str_replace('token=', '', $pwd); + } + + if(($this->pref['e_cron_pwd'] != $pwd) || empty($this->pref['e_cron_pwd'])) + { + if(!empty($pwd)) + { + $msg = "Your Cron Schedule is not configured correctly. Your passwords do not match."; + $msg .= "

"; + $msg .= "Sent from cron: " . $pwd; + $msg .= "
"; + $msg .= "Stored in e107: " . $this->pref['e_cron_pwd']; + $msg .= "

"; + $msg .= "You should regenerate the cron command in admin and enter it again in your server configuration."; + + $msg .= "

" . "Debug Info" . "

"; + $msg .= "

_SERVER

"; + $msg .= print_a($_SERVER, true); + $msg .= "

_ENV

"; + $msg .= print_a($_ENV, true); + $msg .= "

_GET

"; + $msg .= print_a($_GET, true); + + $mail = array( + 'to_mail' => $this->pref['siteadminemail'], + 'to_name' => $this->pref['siteadmin'], + 'from_mail' => $this->pref['siteadminemail'], + 'from_name' => $this->pref['siteadmin'], + 'message' => $msg, + 'subject' => 'e107 - Cron Schedule Misconfigured', + ); + + $this->sendMail($mail); + } + + return false; + } + + return true; + } + + /** + * Get available Cron jobs. + * + * @param bool $only_active + * Set to TRUE for active cron jobs. + * + * @return array + * Array contains cron jobs. + */ + public function getCronJobs($only_active = false) + { + $list = array(); + + $sql = e107::getDb(); + + $where = '1'; + + if($only_active === true) + { + $where = 'cron_active = 1'; + } + + if($sql->select("cron", 'cron_function,cron_tab,cron_active', $where)) + { + while($row = $sql->fetch()) + { + list($class, $function) = explode("::", $row['cron_function'], 2); + $key = $class . "__" . $function; + + $list[$key] = array( + 'path' => $class, + 'active' => $row['cron_active'], + 'tab' => $row['cron_tab'], + 'function' => $function, + 'class' => $class, + ); + } + } + + return $list; + } + + /** + * Helper method to send email message. + * + * @param array $mail + */ + public function sendMail($mail) + { + require_once(e_HANDLER . "mail.php"); + sendemail($mail['to_mail'], $mail['subject'], $mail['message'], $mail['to_name'], $mail['from_mail'], $mail['from_name']); + } + +}