From 7b9a0db983c27cb2d55520162a1e4f5247c5e8a5 Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Tue, 9 Mar 2010 14:58:48 -0700 Subject: [PATCH] Convert Horde_Scheduler to H4. --- framework/Scheduler/lib/Horde/Scheduler.php | 78 +++++----- framework/Scheduler/lib/Horde/Scheduler/Cron.php | 126 +++++++++++++++ .../Horde/Scheduler/{cron.php => Cron/Date.php} | 170 ++++----------------- framework/Scheduler/package.xml | 42 +++-- .../scripts/Horde/Scheduler/horde-crond.php | 16 +- whups/lib/Scheduler/{whups.php => Whups.php} | 22 +-- whups/scripts/reminders.php | 3 +- 7 files changed, 236 insertions(+), 221 deletions(-) create mode 100644 framework/Scheduler/lib/Horde/Scheduler/Cron.php rename framework/Scheduler/lib/Horde/Scheduler/{cron.php => Cron/Date.php} (64%) rename whups/lib/Scheduler/{whups.php => Whups.php} (71%) diff --git a/framework/Scheduler/lib/Horde/Scheduler.php b/framework/Scheduler/lib/Horde/Scheduler.php index 793c74bb7..d88d0a77e 100644 --- a/framework/Scheduler/lib/Horde/Scheduler.php +++ b/framework/Scheduler/lib/Horde/Scheduler.php @@ -4,21 +4,43 @@ * * @package Horde_Scheduler */ -class Horde_Scheduler { - +class Horde_Scheduler +{ /** * Name of the sleep function. * * @var string */ - var $_sleep; + protected $_sleep; /** * Adjustment factor to sleep in microseconds. * * @var integer */ - var $_sleep_adj; + protected $_sleep_adj; + + /** + * Attempts to return a concrete Horde_Scheduler instance based on $driver. + * + * @param string $driver The type of concrete subclass to return. + * @param array $params A hash containing any additional configuration or + * connection parameters a subclass might need. + * + * @return Horde_Scheduler The newly created concrete instance. + * @throws Horde_Scheduler_Exception + */ + static public function factory($driver, $params = null) + { + $driver = basename($driver); + $class = 'Horde_Scheduler_' . $driver; + + if (class_exists($class)) { + return new $class($params); + } + + throw new Horde_Scheduler_Exception('Class definition of ' . $class . ' not found.'); + } /** * Constructor. @@ -26,7 +48,7 @@ class Horde_Scheduler { * Figures out how we can best sleep with microsecond precision * based on what platform we're running on. */ - function Horde_Scheduler() + public function __construct() { if (!strncasecmp(PHP_OS, 'WIN', 3)) { $this->_sleep = 'sleep'; @@ -39,10 +61,8 @@ class Horde_Scheduler { /** * Main loop/action function. - * - * @abstract */ - function run() + public function run() { } @@ -54,10 +74,12 @@ class Horde_Scheduler { * serialization or deserialization - handling database * connections, etc. * - * @param string $id An id to uniquely identify this scheduler from - * others of the same class. + * @param string $id An id to uniquely identify this scheduler from + * others of the same class. + * + * @return boolean Success result. */ - function serialize($id = '') + public function serialize($id = '') { try { $vfs = VFS::singleton($GLOBALS['conf']['vfs']['type'], @@ -73,15 +95,15 @@ class Horde_Scheduler { /** * Restore a Horde_Scheduler object from the cache. * - * @param string $class The name of the Horde_Scheduler object to restore. - * @param string $id An id to uniquely identify this + * @param string $class The name of the object to restore. + * @param string $id An id to uniquely identify this * scheduler from others of the same class. * @param boolean $autosave Automatically store (serialize) the returned * object at script shutdown. * * @see Horde_Scheduler::serialize() */ - function &unserialize($class, $id = '', $autosave = true) + public function unserialize($class, $id = '', $autosave = true) { // Need a lowercase version of the classname, and a default // instance of the scheduler object in case we can't retrieve @@ -112,35 +134,9 @@ class Horde_Scheduler { * * @param integer $msec Microseconds to sleep. */ - function sleep($msec) + public function sleep($msec) { call_user_func($this->_sleep, $msec / $this->_sleep_adj); } - /** - * Attempts to return a concrete Horde_Scheduler instance based on $driver. - * - * @param string $driver The type of concrete Horde_Scheduler subclass to - * return. - * @param array $params A hash containing any additional configuration or - * connection parameters a subclass might need. - * - * @return Horde_Scheduler The newly created concrete Horde_Scheduler - * instance, or an error object. - */ - function factory($driver, $params = null) - { - $driver = basename($driver); - $class = 'Horde_Scheduler_' . $driver; - if (!class_exists($class)) { - include 'Horde/Scheduler/' . $driver . '.php'; - } - - if (class_exists($class)) { - return new $class($params); - } else { - return PEAR::raiseError('Class definition of ' . $class . ' not found.'); - } - } - } diff --git a/framework/Scheduler/lib/Horde/Scheduler/Cron.php b/framework/Scheduler/lib/Horde/Scheduler/Cron.php new file mode 100644 index 000000000..6cea92804 --- /dev/null +++ b/framework/Scheduler/lib/Horde/Scheduler/Cron.php @@ -0,0 +1,126 @@ +addTask('perl somescript.pl', '0 0,5,10,15,20,25,30,35,40,45,50,55 * * *'); + * + * // Run this command midnight of the first Friday of odd numbered months. + * $cron->addTask('php -q somescript.php', '0 0 0 1-7&Fri 1,3,5,7,9,11'); + * + * // Also run this command midnight of the second Thursday and Saturday of the even numbered months. + * $cron->addTask('php -q somescript.php', '0 0 0 8-15&Thu,8-15&Sat 2,4,6,8,10,12'); + * + * $cron->run(); + * + * @author Ryan Flynn + * @author Chuck Hagenbuch + * @package Horde_Scheduler + */ +class Horde_Scheduler_Cron extends Horde_Scheduler +{ + /** + * TODO + * + * @var array + */ + protected $_tasks = array(); + + /** + * Every time a task is added it will get a fresh uid even if + * immediately removed. + * + * @var integer + */ + var $_counter = 1; + + /** + */ + public function addTask($cmd, $rules) + { + $ds = new Horde_Scheduler_Cron_Date($rules); + + $this->_counter++; + + $this->_tasks[] = + array( + 'uid' => $this->_counter, + 'rules' => $ds, + 'cmd' => $cmd + ); + + return $this->_counter; + } + + /** + */ + public function removeTask($uid) + { + $count = count($this->_tasks); + for ($i = 0; $i < $count; $i++) { + if ($this->_tasks['uid'] == $uid) { + $found = $i; + array_splice($this->_tasks, $i); + return $i; + } + } + + return 0; + } + + /** + */ + public function run() + { + if (!count($this->_tasks)) { + exit("crond: Nothing to schedule; exiting.\n"); + } + + while (true) { + $t = time(); + + // Check each task. + foreach ($this->_tasks as $task) { + if ($task['rules']->nowMatches()) { + $this->runcmd($task); + } + } + + // Wait until the next second. + while (time() == $t) { + $this->sleep(100000); + } + } + } + + /** + */ + public function runcmd(&$task) + { + Horde::logMessage('runcmd(): ' . $task['cmd'] . ' run by ' . $task['uid'], __FILE__, __LINE__, PEAR_LOG_INFO); + return shell_exec($task['cmd']); + } + +} diff --git a/framework/Scheduler/lib/Horde/Scheduler/cron.php b/framework/Scheduler/lib/Horde/Scheduler/Cron/Date.php similarity index 64% rename from framework/Scheduler/lib/Horde/Scheduler/cron.php rename to framework/Scheduler/lib/Horde/Scheduler/Cron/Date.php index ea780da50..678b85987 100644 --- a/framework/Scheduler/lib/Horde/Scheduler/cron.php +++ b/framework/Scheduler/lib/Horde/Scheduler/Cron/Date.php @@ -1,140 +1,30 @@ addTask('perl somescript.pl', '0 0,5,10,15,20,25,30,35,40,45,50,55 * * *'); - * - * // Run this command midnight of the first Friday of odd numbered months. - * $cron->addTask('php -q somescript.php', '0 0 0 1-7&Fri 1,3,5,7,9,11'); - * - * // Also run this command midnight of the second Thursday and Saturday of the even numbered months. - * $cron->addTask('php -q somescript.php', '0 0 0 8-15&Thu,8-15&Sat 2,4,6,8,10,12'); - * - * $cron->run(); - * * @author Ryan Flynn * @author Chuck Hagenbuch * @package Horde_Scheduler */ -class Horde_Scheduler_cron extends Horde_Scheduler { +class Horde_Scheduler_Cron_Date +{ + public $legalDays = array('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'); - var $_tasks = array(); + public $sec; + public $min; + public $hour; + public $day; + public $month; - /** - * Every time a task is added it will get a fresh uid even if - * immediately removed. - */ - var $_counter = 1; - - function addTask($cmd, $rules) - { - $ds = new Horde_Scheduler_cronDate($rules); - - $this->_counter++; - - $this->_tasks[] = - array( - 'uid' => $this->_counter, - 'rules' => $ds, - 'cmd' => $cmd - ); - - return $this->_counter; - } - - function removeTask($uid) - { - $count = count($this->_tasks); - for ($i = 0; $i < $count; $i++) { - if ($this->_tasks['uid'] == $uid) { - $found = $i; - array_splice($this->_tasks, $i); - return $i; - } - } - - return 0; - } - - function run() - { - if (!count($this->_tasks)) { - exit("crond: Nothing to schedule; exiting.\n"); - } - - while (true) { - $t = time(); - - // Check each task. - foreach ($this->_tasks as $task) { - if ($task['rules']->nowMatches()) { - $this->runcmd($task); - } - } - - // Wait until the next second. - while (time() == $t) { - $this->sleep(100000); - } - } - } - - function runcmd(&$task) - { - Horde::logMessage('Horde_Scheduler_Cron::runcmd(): ' . $task['cmd'] . ' run by ' . $task['uid'], __FILE__, __LINE__, PEAR_LOG_INFO); - return shell_exec($task['cmd']); - } - -} - -/** - * @package Horde_Scheduler - */ -class Horde_Scheduler_cronDate { - - var $legalDays = array('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'); - - var $sec; - var $min; - var $hour; - var $day; - var $month; - - function Horde_Scheduler_cronDate($raw) + public function __construct($raw) { $this->parse(Horde_String::upper($raw)); } - function nowMatches() + public function nowMatches() { return $this->scheduledAt(time()); } - function scheduledAt($ts = null) + public function scheduledAt($ts = null) { if ($ts === null) { $ts = time(); @@ -147,7 +37,7 @@ class Horde_Scheduler_cronDate { $this->secMatches($ts)); } - function monthMatches($ts) + public function monthMatches($ts) { if ($this->month == '*') { return true; @@ -158,7 +48,7 @@ class Horde_Scheduler_cronDate { return (bool)strpos($this->month, $currentmonth); } - function dayMatches($ts) + public function dayMatches($ts) { if (!empty($this->day['value']) && $this->day['value'] == '*') { return true; @@ -183,7 +73,7 @@ class Horde_Scheduler_cronDate { return false; } - function hourMatches($ts) + public function hourMatches($ts) { if ($this->hour == '*') { return true; @@ -194,7 +84,7 @@ class Horde_Scheduler_cronDate { return (strpos($this->hour, $currenthour) !== false); } - function minMatches($ts) + public function minMatches($ts) { if ($this->min == '*') { return true; @@ -205,7 +95,7 @@ class Horde_Scheduler_cronDate { return (strpos($this->min, $currentmin) !== false); } - function secMatches($ts) + public function secMatches($ts) { if ($this->sec == '*') { return true; @@ -216,7 +106,7 @@ class Horde_Scheduler_cronDate { return (strpos($this->sec, $currentsec) !== false); } - function parse($str) + public function parse($str) { $s = array(); @@ -308,7 +198,7 @@ class Horde_Scheduler_cronDate { } } - function isCond($s) + public function isCond($s) { if (strpos($s, '&') !== false) { return '&'; @@ -319,27 +209,27 @@ class Horde_Scheduler_cronDate { } } - function isRange($s) + public function isRange($s) { return preg_match('/^\w+\-\w+/', $s); } - function isCondRange($s) + public function isCondRange($s) { - return (isCond($s) && isRange($s)); + return ($this->isCond($s) && $this->isRange($s)); } - function isCondVal($s) + public function isCondVal($s) { - return (isCond($s) && !isRange($s)); + return ($this->isCond($s) && !$this->isRange($s)); } - function rangeVals($s) + public function rangeVals($s) { return explode('-', $s); } - function expandRange($l, $h = '') + public function expandRange($l, $h = '') { // Expand range from 1-5 -> '-1-2-3-4-5-'. if (is_array($l)) { @@ -382,7 +272,7 @@ class Horde_Scheduler_cronDate { } } - function dayValue($s) + public function dayValue($s) { for ($i = 0; $i < count($this->legalDays); $i++) { if ($this->legalDays[$i] == $s) { @@ -393,22 +283,22 @@ class Horde_Scheduler_cronDate { return -1; } - function isDigit($s) + public function isDigit($s) { return preg_match('/^\d+$/', $s); } - function isAlpha($s) + public function isAlpha($s) { return $this->isLegalDay($s); } - function isLegalDay($s) + public function isLegalDay($s) { return in_array($s, $this->legalDays); } - function generallyDecentSyntax($s) + public function generallyDecentSyntax($s) { return ($s == '*' || preg_match('/^\d+(-\d+)?([!&][A-Z\*]+(-[A-Z\*]+)?)?(,\d+(-\d+)?([!&][A-Z\*]+(-[A-Z\*]+)?)?)*$/', $s)); diff --git a/framework/Scheduler/package.xml b/framework/Scheduler/package.xml index c73fe7cc5..0f7dad1ac 100644 --- a/framework/Scheduler/package.xml +++ b/framework/Scheduler/package.xml @@ -14,18 +14,17 @@ http://pear.php.net/dtd/package-2.0.xsd"> chuck@horde.org yes - 2006-05-08 - + 2010-03-09 - 0.0.2 - 0.0.2 + 0.1.0 + 0.1.0 - alpha - alpha + beta + beta LGPL - Converted to package.xml 2.0 for pear.horde.org + * Initial Horde 4 package. @@ -41,7 +40,10 @@ http://pear.php.net/dtd/package-2.0.xsd"> - + + + + @@ -51,13 +53,13 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 4.0.0 + 5.2.0 - 1.4.0b1 + 1.7.0 - Horde_Framework + Core pear.horde.org @@ -73,12 +75,28 @@ http://pear.php.net/dtd/package-2.0.xsd"> - + + + 2006-05-08 + + + 0.0.2 + 0.0.2 + + + alpha + alpha + + LGPL + Converted to package.xml 2.0 for pear.horde.org + + + 0.0.1 0.0.1 diff --git a/framework/Scheduler/scripts/Horde/Scheduler/horde-crond.php b/framework/Scheduler/scripts/Horde/Scheduler/horde-crond.php index b5fa87ef9..e778799f2 100755 --- a/framework/Scheduler/scripts/Horde/Scheduler/horde-crond.php +++ b/framework/Scheduler/scripts/Horde/Scheduler/horde-crond.php @@ -9,20 +9,14 @@ * @package Horde_Scheduler */ -require_once 'Horde/Cli.php'; -require_once 'Horde/Scheduler.php'; +// The base file path of horde. +$horde_base = '/path/to/horde'; -// Make sure no one runs this from the web. -if (!Horde_Cli::runningFromCLI()) { - exit("Must be run from the command line\n"); -} - -// Load the CLI environment - make sure there's no time limit, init -// some variables, etc. -Horde_Cli::init(); +require_once $horde_base . '/lib/Application.php'; +Horde_Registry::appInit('horde', array('authentication' => 'none', 'cli' => true)); // Get an instance of the cron scheduler. -$daemon = Horde_Scheduler::factory('cron'); +$daemon = Horde_Scheduler::factory('Cron'); // Now add some cron jobs to do, or add parsing to read a config file. // $daemon->addTask('ls', '0,5,10,15,20,30,40 * * * *'); diff --git a/whups/lib/Scheduler/whups.php b/whups/lib/Scheduler/Whups.php similarity index 71% rename from whups/lib/Scheduler/whups.php rename to whups/lib/Scheduler/Whups.php index 913e859be..da9d392e3 100644 --- a/whups/lib/Scheduler/whups.php +++ b/whups/lib/Scheduler/Whups.php @@ -1,25 +1,17 @@ _runtime = time(); @@ -31,7 +23,7 @@ class Horde_Scheduler_whups extends Horde_Scheduler { } foreach ($this->_reminders as $reminder) { - $ds = new Horde_Scheduler_cronDate($reminder['frequency']); + $ds = new Horde_Scheduler_Cron_Date($reminder['frequency']); if ($ds->scheduledAt($this->_runtime)) { if (!empty($reminder['server_name'])) { $GLOBALS['conf']['server']['name'] = $reminder['server_name']; diff --git a/whups/scripts/reminders.php b/whups/scripts/reminders.php index 26b6033d9..a34a9c5eb 100755 --- a/whups/scripts/reminders.php +++ b/whups/scripts/reminders.php @@ -13,8 +13,7 @@ require_once dirname(__FILE__) . '/../lib/Application.php'; Horde_Registry::appInit('whups', array('authentication' => 'none')); // Get an instance of the Whups scheduler. -require_once WHUPS_BASE . '/lib/Scheduler/whups.php'; -$reminder = Horde_Scheduler::unserialize('Horde_Scheduler_whups'); +$reminder = Horde_Scheduler::unserialize('Horde_Scheduler_Whups'); // Check for and send reminders. $reminder->run(); -- 2.11.0