From b1a6a5a3991cec5cd08873b01376e45d0b247f18 Mon Sep 17 00:00:00 2001 From: Marius Cramer <m.cramer@pixcept.de> Date: Thu, 14 Nov 2013 09:05:33 -0500 Subject: [PATCH] Cleaning up code to match coding guidelines --- server/lib/classes/cron.inc.php | 475 ++++++++++++++++++++++++++++++----------------------------- 1 files changed, 240 insertions(+), 235 deletions(-) diff --git a/server/lib/classes/cron.inc.php b/server/lib/classes/cron.inc.php index c7bea32..48ca093 100644 --- a/server/lib/classes/cron.inc.php +++ b/server/lib/classes/cron.inc.php @@ -29,243 +29,248 @@ */ class cron { - - /**#@+ + + /**#@+ * @access private */ - private $_sMinute = ''; - private $_sHour = ''; - private $_sDay = ''; - private $_sMonth = ''; - private $_sWDay = ''; - private $_bParsed = false; - private $_iNextRun = null; - private $_aValidValues; - - public function __construct() { - // empty - $this->_sMinute = ''; - $this->_sHour = ''; - $this->_sDay = ''; - $this->_sMonth = ''; - $this->_sWDay = ''; - $this->_bParsed = false; - $this->_aValidValues = array('minute' => array(), - 'hour' => array(), - 'day' => array(), - 'month' => array(), - 'weekday' => array()); - } - - private function _calcValidValues() { - // minute field - $this->_aValidValues['minute'] = $this->_calcFieldValues('minute', $this->_sMinute); - $this->_aValidValues['hour'] = $this->_calcFieldValues('hour', $this->_sHour); - $this->_aValidValues['day'] = $this->_calcFieldValues('day', $this->_sDay); - $this->_aValidValues['month'] = $this->_calcFieldValues('month', $this->_sMonth); - $this->_aValidValues['weekday'] = $this->_calcFieldValues('weekday', $this->_sWDay); - $this->_bParsed = true; - } - - private function _calcFieldValues($sField, $sValue) { - global $app; - - $aValidValues = array(); - - // global checks - $iFrom = 0; - $iTo = 0; - switch($sField) { - case 'minute': - $iTo = 59; - break; - case 'hour': - $iTo = 23; - break; - case 'day': - $iFrom = 1; - $iTo = 31; - break; - case 'month': - $sValue = strtr($sValue, array('JAN' => 1, - 'FEB' => 2, - 'MAR' => 3, - 'APR' => 4, - 'MAY' => 5, - 'JUN' => 6, - 'JUL' => 7, - 'AUG' => 8, - 'SEP' => 9, - 'OCT' => 10, - 'NOV' => 11, - 'DEC' => 12) - ); - $iFrom = 1; - $iTo = 12; - break; - case 'weekday': - $sValue = strtr($sValue, array('SUN' => 0, - 'MON' => 1, - 'TUE' => 2, - 'WED' => 3, - 'THU' => 4, - 'FRI' => 5, - 'SAT' => 6, - '7' => 0) - ); - $iTo = 6; - break; - } - $aParts = explode(',', $sValue); - for($a = 0; $a < count($aParts); $a++) { - $sValue = $aParts[$a]; - $iValue = $app->functions->intval($sValue); - - if($sValue === '*') { - // everything is valid - for($i = $iFrom; $i <= $iTo; $i++) { - $aValidValues[] = $i; - } - break; // no need to go any further - } elseif((string)$iValue == $sValue) { - if($iValue >= $iFrom && $iValue <= $iTo) $aValidValues[] = $iValue; - } elseif(preg_match('/^([0-9]+)-([0-9]+)(\/([1-9][0-9]*))?$/', $sValue, $aMatch)) { - if($aMatch[1] < $iFrom) $aMatch[1] = $iFrom; - if($aMatch[2] > $iTo) $aMatch[2] = $iTo; - if(isset($aMatch[3])) { - for($i = $aMatch[1]; $i <= $aMatch[2]; $i++) { - if(($i - $aMatch[1]) % $aMatch[4] == 0) $aValidValues[] = $i; - } - } else { - for($i = $aMatch[1]; $i <= $aMatch[2]; $i++) $aValidValues[] = $i; - } - } elseif(preg_match('/^\*\/([1-9][0-9]*)$/', $sValue, $aMatch)) { - for($i = $iFrom; $i <= $iTo; $i++) { - if($i % $aMatch[1] == 0) $aValidValues[] = $i; - } - } - } - - $aValidValues = array_unique($aValidValues); - sort($aValidValues); - - return $aValidValues; - } - - /**#@-*/ - - /** - * Set the cron field values - * - * @param string $sMinute the minute field value - * @param string $sHour the hour field value - * @param string $sDay the day field value - * @param string $sWDay the weekday field value - * @param string $sMonth the month field value - */ - public function setCronFields($sMinute = '*', $sHour = '*', $sDay = '*', $sMonth = '*', $sWDay = '*') { - $this->_sMinute = $sMinute; - $this->_sHour = $sHour; - $this->_sDay = $sDay; - $this->_sMonth = $sMonth; - $this->_sWDay = $sWDay; - $this->_bParsed = false; - } - - /** - * Parse a line of a cron and set the internal field values - * - * @param string $sLine cron line - */ - public function parseCronLine($sLine) { - $aFields = preg_split('/[ \t]+/', trim($sLine)); - for($i = 0; $i < 5; $i++) { - if(!isset($aFields[$i])) $aFields[$i] = '*'; - } - if($aFields[0] == '@yearly' || $aFields[0] == '@annually') $aFields = array(0, 0, 1, 1, '*'); - elseif($aFields[0] == '@monthly') $aFields = array(0, 0, 1, '*', '*'); - elseif($aFields[0] == '@weekly') $aFields = array(0, 0, '*', '*', 0); - elseif($aFields[0] == '@daily' || $aFields[0] == '@midnight') $aFields = array(0, 0, '*', '*', '*'); - elseif($aFields[0] == '@hourly') $aFields = array(0, '*', '*', '*', '*'); - - $this->setCronFields($aFields[0], $aFields[1], $aFields[2], $aFields[3], $aFields[4]); - } - - public function getNextRun($vDate) { - global $app; - - $iTimestamp = ISPConfigDatetime::to_timestamp($vDate); - if($iTimestamp === false) return $iTimestamp; - - if($this->_bParsed == false) $this->_calcValidValues(); - - // get the field values for the given Date. - list($iMinute, $iHour, $iDay, $iWDay, $iMonth, $iYear) = explode(':', ISPConfigDateTime::to_string($vDate, 'custom:%M:%H:%d:%w:%m:%Y')); - - $bValid = false; - $iStartYear = $iYear; - while($bValid == false) { - $iCurMinute = $this->_getNextValue('minute', $iMinute, true); - $iCurHour = $this->_getNextValue('hour', $iHour, true); - $iCurDay = $this->_getNextValue('day', $iDay, true); - $iCurMonth = $this->_getNextValue('month', $iMonth, true); - $iCurWDay = $this->_getNextValue('weekday', $iWDay, true); - - $iNextMinute = $this->_getNextValue('minute', $iMinute); - $iNextHour = $this->_getNextValue('hour', $iHour); - $iNextDay = $this->_getNextValue('day', $iDay); - $iNextMonth = $this->_getNextValue('month', $iMonth); - $iNextWDay = $this->_getNextValue('weekday', $iWDay); - - if($iNextMinute > $iMinute && $iHour == $iCurHour && $iDay == $iCurDay && $iWDay == $iCurWDay && $iMonth == $iCurMonth) { - $iMinute = $iNextMinute; - } elseif($iNextHour > $iHour && $iDay == $iCurDay && $iWDay == $iCurWDay && $iMonth == $iCurMonth) { - $iMinute = reset($this->_aValidValues['minute']); - $iHour = $iNextHour; - } elseif($iNextDay > $iDay && ISPConfigDateTime::last_day($iMonth) >= $iNextDay && $iMonth == $iCurMonth) { - $iMinute = reset($this->_aValidValues['minute']); - $iHour = reset($this->_aValidValues['hour']); - $iDay = $iNextDay; - } elseif($iNextMonth > $iMonth) { - $iMinute = reset($this->_aValidValues['minute']); - $iHour = reset($this->_aValidValues['hour']); - $iDay = reset($this->_aValidValues['day']); - $iMonth = $iNextMonth; - } else { - $iMinute = reset($this->_aValidValues['minute']); - $iHour = reset($this->_aValidValues['hour']); - $iDay = reset($this->_aValidValues['day']); - $iMonth = reset($this->_aValidValues['month']); - $iYear++; - } - - $ts = mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear); - //print strftime('%d.%m.%Y (%A) %H:%M', $ts) . "\n"; - //var_dump($iCurMinute, $iCurHour, $iCurDay, $iCurMonth, $iCurWDay, '--', $iNextMinute, $iNextHour, $iNextDay, $iNextMonth, $iNextWDay); - if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(strftime('%w', $ts)), $this->_aValidValues['weekday'], true) === true) { - $bValid = true; - } else { - if($iYear - $iStartYear > 5) { - if(LOG_PRIORITY <= PRIO_ERROR) $portal->log('No valid run dates for schedule ' . $this->_sMinute . ' ' . $this->_sHour . ' ' . $this->_sDay . ' ' . $this->_sMonth . ' ' . $this->_sWDay . ' in the next 5 years!', PRIO_ERROR, __FILE__, __LINE__); - return false; - } - } - } - - //var_dump($vDate, implode('-', array($iYear, $iMonth, $iDay, $iHour, $iNextMinute, 0)), $this->_sMinute, $this->_sHour, $this->_sDay, $this->_sWDay, $this->_sMonth, $this->_aValidValues); - return $iYear . '-' . $iMonth . '-' . $iDay . ' ' . $iHour . ':' . $iNextMinute . ':0'; - } - - private function _getNextValue($sField, $iValue, $bIncludeCurrent = false) { - if(!array_key_exists($sField, $this->_aValidValues)) return false; - - reset($this->_aValidValues[$sField]); - while(($cur = each($this->_aValidValues[$sField])) !== false) { - if($bIncludeCurrent == true && $cur['value'] >= $iValue) return $cur['value']; - elseif($cur['value'] > $iValue) return $cur['value']; - } - return reset($this->_aValidValues[$sField]); - } + private $_sMinute = ''; + private $_sHour = ''; + private $_sDay = ''; + private $_sMonth = ''; + private $_sWDay = ''; + private $_bParsed = false; + private $_iNextRun = null; + private $_aValidValues; + + public function __construct() { + // empty + $this->_sMinute = ''; + $this->_sHour = ''; + $this->_sDay = ''; + $this->_sMonth = ''; + $this->_sWDay = ''; + $this->_bParsed = false; + $this->_aValidValues = array('minute' => array(), + 'hour' => array(), + 'day' => array(), + 'month' => array(), + 'weekday' => array()); + } + + private function _calcValidValues() { + // minute field + $this->_aValidValues['minute'] = $this->_calcFieldValues('minute', $this->_sMinute); + $this->_aValidValues['hour'] = $this->_calcFieldValues('hour', $this->_sHour); + $this->_aValidValues['day'] = $this->_calcFieldValues('day', $this->_sDay); + $this->_aValidValues['month'] = $this->_calcFieldValues('month', $this->_sMonth); + $this->_aValidValues['weekday'] = $this->_calcFieldValues('weekday', $this->_sWDay); + $this->_bParsed = true; + } + + private function _calcFieldValues($sField, $sValue) { + global $app; + + $aValidValues = array(); + + // global checks + $iFrom = 0; + $iTo = 0; + switch($sField) { + case 'minute': + $iTo = 59; + break; + case 'hour': + $iTo = 23; + break; + case 'day': + $iFrom = 1; + $iTo = 31; + break; + case 'month': + $sValue = strtr($sValue, array('JAN' => 1, + 'FEB' => 2, + 'MAR' => 3, + 'APR' => 4, + 'MAY' => 5, + 'JUN' => 6, + 'JUL' => 7, + 'AUG' => 8, + 'SEP' => 9, + 'OCT' => 10, + 'NOV' => 11, + 'DEC' => 12) + ); + $iFrom = 1; + $iTo = 12; + break; + case 'weekday': + $sValue = strtr($sValue, array('SUN' => 0, + 'MON' => 1, + 'TUE' => 2, + 'WED' => 3, + 'THU' => 4, + 'FRI' => 5, + 'SAT' => 6, + '7' => 0) + ); + $iTo = 6; + break; + } + $aParts = explode(',', $sValue); + for($a = 0; $a < count($aParts); $a++) { + $sValue = $aParts[$a]; + $iValue = $app->functions->intval($sValue); + + if($sValue === '*') { + // everything is valid + for($i = $iFrom; $i <= $iTo; $i++) { + $aValidValues[] = $i; + } + break; // no need to go any further + } elseif((string)$iValue == $sValue) { + if($iValue >= $iFrom && $iValue <= $iTo) $aValidValues[] = $iValue; + } elseif(preg_match('/^([0-9]+)-([0-9]+)(\/([1-9][0-9]*))?$/', $sValue, $aMatch)) { + if($aMatch[1] < $iFrom) $aMatch[1] = $iFrom; + if($aMatch[2] > $iTo) $aMatch[2] = $iTo; + if(isset($aMatch[3])) { + for($i = $aMatch[1]; $i <= $aMatch[2]; $i++) { + if(($i - $aMatch[1]) % $aMatch[4] == 0) $aValidValues[] = $i; + } + } else { + for($i = $aMatch[1]; $i <= $aMatch[2]; $i++) $aValidValues[] = $i; + } + } elseif(preg_match('/^\*\/([1-9][0-9]*)$/', $sValue, $aMatch)) { + for($i = $iFrom; $i <= $iTo; $i++) { + if($i % $aMatch[1] == 0) $aValidValues[] = $i; + } + } + } + + $aValidValues = array_unique($aValidValues); + sort($aValidValues); + + return $aValidValues; + } + + /**#@-*/ + + /** + * Set the cron field values + * + * @param string $sMinute the minute field value + * @param string $sHour the hour field value + * @param string $sDay the day field value + * @param string $sWDay the weekday field value + * @param string $sMonth the month field value + */ + + + public function setCronFields($sMinute = '*', $sHour = '*', $sDay = '*', $sMonth = '*', $sWDay = '*') { + $this->_sMinute = $sMinute; + $this->_sHour = $sHour; + $this->_sDay = $sDay; + $this->_sMonth = $sMonth; + $this->_sWDay = $sWDay; + $this->_bParsed = false; + } + + + + /** + * Parse a line of a cron and set the internal field values + * + * @param string $sLine cron line + */ + public function parseCronLine($sLine) { + $aFields = preg_split('/[ \t]+/', trim($sLine)); + for($i = 0; $i < 5; $i++) { + if(!isset($aFields[$i])) $aFields[$i] = '*'; + } + if($aFields[0] == '@yearly' || $aFields[0] == '@annually') $aFields = array(0, 0, 1, 1, '*'); + elseif($aFields[0] == '@monthly') $aFields = array(0, 0, 1, '*', '*'); + elseif($aFields[0] == '@weekly') $aFields = array(0, 0, '*', '*', 0); + elseif($aFields[0] == '@daily' || $aFields[0] == '@midnight') $aFields = array(0, 0, '*', '*', '*'); + elseif($aFields[0] == '@hourly') $aFields = array(0, '*', '*', '*', '*'); + + $this->setCronFields($aFields[0], $aFields[1], $aFields[2], $aFields[3], $aFields[4]); + } + + public function getNextRun($vDate) { + global $app; + + $iTimestamp = ISPConfigDatetime::to_timestamp($vDate); + if($iTimestamp === false) return $iTimestamp; + + if($this->_bParsed == false) $this->_calcValidValues(); + + // get the field values for the given Date. + list($iMinute, $iHour, $iDay, $iWDay, $iMonth, $iYear) = explode(':', ISPConfigDateTime::to_string($vDate, 'custom:%M:%H:%d:%w:%m:%Y')); + + $bValid = false; + $iStartYear = $iYear; + while($bValid == false) { + $iCurMinute = $this->_getNextValue('minute', $iMinute, true); + $iCurHour = $this->_getNextValue('hour', $iHour, true); + $iCurDay = $this->_getNextValue('day', $iDay, true); + $iCurMonth = $this->_getNextValue('month', $iMonth, true); + $iCurWDay = $this->_getNextValue('weekday', $iWDay, true); + + $iNextMinute = $this->_getNextValue('minute', $iMinute); + $iNextHour = $this->_getNextValue('hour', $iHour); + $iNextDay = $this->_getNextValue('day', $iDay); + $iNextMonth = $this->_getNextValue('month', $iMonth); + $iNextWDay = $this->_getNextValue('weekday', $iWDay); + + if($iNextMinute > $iMinute && $iHour == $iCurHour && $iDay == $iCurDay && $iWDay == $iCurWDay && $iMonth == $iCurMonth) { + $iMinute = $iNextMinute; + } elseif($iNextHour > $iHour && $iDay == $iCurDay && $iWDay == $iCurWDay && $iMonth == $iCurMonth) { + $iMinute = reset($this->_aValidValues['minute']); + $iHour = $iNextHour; + } elseif($iNextDay > $iDay && ISPConfigDateTime::last_day($iMonth) >= $iNextDay && $iMonth == $iCurMonth) { + $iMinute = reset($this->_aValidValues['minute']); + $iHour = reset($this->_aValidValues['hour']); + $iDay = $iNextDay; + } elseif($iNextMonth > $iMonth) { + $iMinute = reset($this->_aValidValues['minute']); + $iHour = reset($this->_aValidValues['hour']); + $iDay = reset($this->_aValidValues['day']); + $iMonth = $iNextMonth; + } else { + $iMinute = reset($this->_aValidValues['minute']); + $iHour = reset($this->_aValidValues['hour']); + $iDay = reset($this->_aValidValues['day']); + $iMonth = reset($this->_aValidValues['month']); + $iYear++; + } + + $ts = mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear); + //print strftime('%d.%m.%Y (%A) %H:%M', $ts) . "\n"; + //var_dump($iCurMinute, $iCurHour, $iCurDay, $iCurMonth, $iCurWDay, '--', $iNextMinute, $iNextHour, $iNextDay, $iNextMonth, $iNextWDay); + if(ISPConfigDateTime::last_day($iMonth, $iYear) >= $iDay && in_array($app->functions->intval(strftime('%w', $ts)), $this->_aValidValues['weekday'], true) === true) { + $bValid = true; + } else { + if($iYear - $iStartYear > 5) { + if(LOG_PRIORITY <= PRIO_ERROR) $portal->log('No valid run dates for schedule ' . $this->_sMinute . ' ' . $this->_sHour . ' ' . $this->_sDay . ' ' . $this->_sMonth . ' ' . $this->_sWDay . ' in the next 5 years!', PRIO_ERROR, __FILE__, __LINE__); + return false; + } + } + } + + //var_dump($vDate, implode('-', array($iYear, $iMonth, $iDay, $iHour, $iNextMinute, 0)), $this->_sMinute, $this->_sHour, $this->_sDay, $this->_sWDay, $this->_sMonth, $this->_aValidValues); + return $iYear . '-' . $iMonth . '-' . $iDay . ' ' . $iHour . ':' . $iNextMinute . ':0'; + } + + private function _getNextValue($sField, $iValue, $bIncludeCurrent = false) { + if(!array_key_exists($sField, $this->_aValidValues)) return false; + + reset($this->_aValidValues[$sField]); + while(($cur = each($this->_aValidValues[$sField])) !== false) { + if($bIncludeCurrent == true && $cur['value'] >= $iValue) return $cur['value']; + elseif($cur['value'] > $iValue) return $cur['value']; + } + return reset($this->_aValidValues[$sField]); + } + } ?> -- Gitblit v1.9.1