IcingaConfigHelper: provide helpers for intervals

This commit is contained in:
Thomas Gelf 2016-02-28 12:40:11 +01:00
parent 59317ae9ff
commit 3ee9841bc7
2 changed files with 80 additions and 35 deletions

View File

@ -151,4 +151,83 @@ class IcingaConfigHelper
return $string; return $string;
} }
} }
public static function isValidInterval($interval)
{
if (ctype_digit($interval)) {
return true;
}
$parts = preg_split('/\s+/', $interval, -1, PREG_SPLIT_NO_EMPTY);
$value = 0;
foreach ($parts as $part) {
if (! preg_match('/^(\d+)([dhms]?)$/', $part)) {
return false;
}
}
return true;
}
public static function parseInterval($interval)
{
if (ctype_digit($interval)) {
return (int) $interval;
}
$parts = preg_split('/\s+/', $interval, -1, PREG_SPLIT_NO_EMPTY);
$value = 0;
foreach ($parts as $part) {
if (! preg_match('/^(\d+)([dhms]?)$/', $part, $m)) {
throw new ProgrammingError(
'"%s" is not a valid time (duration) definition',
$interval
);
}
switch ($m[2]) {
case 'd':
$value += $m[1] * 86400;
break;
case 'h':
$value += $m[1] * 3600;
break;
case 'm':
$value += $m[1] * 60;
break;
default:
$value += (int) $m[1];
}
}
return $value;
}
public static function renderInterval($interval)
{
// TODO: compat only, do this at munge time. All db fields should be int
$seconds = self::parseInterval($interval);
if ($seconds === 0) {
return '0s';
}
$parts = array();
$steps = array(
'd' => 86400,
'h' => 3600,
'm' => 60,
);
foreach ($steps as $unit => $duration) {
if ($seconds > $duration) {
$parts[] = (int) floor($seconds / $duration) . $unit;
$seconds = $seconds % $duration;
}
}
if ($seconds > 0) {
$parts[] = $seconds . 's';
}
return implode(' ', $parts);
}
} }

View File

@ -849,41 +849,7 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer
protected function renderPropertyAsSeconds($key) protected function renderPropertyAsSeconds($key)
{ {
// TODO: db field should be int return c::renderKeyValue($key, c::renderInterval($this->$key));
if (ctype_digit($this->$key)) {
$value = (int) $this->$key;
} else {
// TODO: do this at munge time
$parts = preg_split('/\s+/', $this->$key, -1, PREG_SPLIT_NO_EMPTY);
$value = 0;
foreach ($parts as $part) {
if (! preg_match('/^(\d+)([dhms]?)$/', $part, $m)) {
throw new ConfigurationError(
'"%s" is not a valid time (duration) definition',
$this->$key
);
}
switch ($m[2]) {
case 'd':
$value += $m[1] * 86400;
break;
case 'h':
$value += $m[1] * 3600;
break;
case 'm':
$value += $m[1] * 60;
break;
default:
$value += (int) $m[1];
}
}
}
if ($value > 0 && $value % 60 === 0) {
$value = (int) ($value / 60) . 'm';
}
return c::renderKeyValue($key, $value);
} }
protected function renderSuffix() protected function renderSuffix()