From b5e79d087cecb530a68d6e3fdb90cf68715350bd Mon Sep 17 00:00:00 2001 From: robert Date: Sun, 22 May 2005 21:30:43 +0000 Subject: [PATCH] allow key names and functions at update and use both for internal implemented stuff --- include/classes/rrdstat.php-class | 37 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/include/classes/rrdstat.php-class b/include/classes/rrdstat.php-class index 9ba8bde..bc41408 100644 --- a/include/classes/rrdstat.php-class +++ b/include/classes/rrdstat.php-class @@ -289,13 +289,19 @@ class rrdstat { if ($this->status != 'ok') { trigger_error('Cannot update non-writeable file', E_USER_WARNING); return 1; } $upvals = array(); if (isset($this->config_raw['update'])) { - $evalcode = $this->config_raw['update']; - if (!is_null($evalcode)) { - ob_start(); - eval($evalcode); - $ret = ob_get_contents(); - if (strlen($ret)) { $upvals = explode("\n", $ret); } - ob_end_clean(); + if (preg_match('/^\s*function\s+{(.*)}\s*$/is', $this->config_raw['update'], $regs)) { + $upfunc = create_function('', $regs[1]); + $upvals = $upfunc(); + } + else { + $evalcode = $this->config_raw['update']; + if (!is_null($evalcode)) { + ob_start(); + eval($evalcode); + $ret = ob_get_contents(); + if (strlen($ret)) { $upvals = explode("\n", $ret); } + ob_end_clean(); + } } } else { @@ -304,7 +310,7 @@ class rrdstat { elseif (isset($ds['update'])) { $val = null; $evalcode = null; if (substr($ds['update'], 0, 4) == 'val:') { - $evalcode = 'print(trim('.substr($ds['update'], 4).'));'; + $evalcode = 'function { return trim('.substr($ds['update'], 4).')); }'; } elseif (substr($ds['update'], 0, 8) == 'snmp-if:') { $snmphost = 'localhost'; $snmpcomm = 'public'; @@ -318,11 +324,15 @@ class rrdstat { if ($valtype == 'in') { $oid = '1.3.6.1.2.1.2.2.1.10.'.$ifnr; } elseif ($valtype == 'out') { $oid = '1.3.6.1.2.1.2.2.1.16.'.$ifnr; } if (!is_null($ifnr) && !is_null($oid)) { - $evalcode = 'print(trim(substr(strrchr(`snmpget -v2c -c '.$snmpcomm.' '.$snmphost.' '.$oid.'`,":"),1)));'; + $evalcode = 'function { return trim(substr(strrchr(`snmpget -v2c -c '.$snmpcomm.' '.$snmphost.' '.$oid.'`,":"),1)); }'; } } else { $evalcode = $ds['update']; } - if (!is_null($evalcode)) { + if (preg_match('/^\s*function\s+{(.*)}\s*$/is', $evalcode, $regs)) { + $upfunc = create_function('', $regs[1]); + $val = $upfunc(); + } + elseif (!is_null($evalcode)) { ob_start(); eval($evalcode); $val = ob_get_contents(); @@ -330,23 +340,24 @@ class rrdstat { } } else { $val = null; } - $upvals[] = $val; + $upvals[$ds['name']] = $val; } } + $key_names = (!is_numeric(array_shift(array_keys($upvals)))); if (in_array('L', $upvals)) { // for at least one value, we need to set the same as the last recorded value $fvals = $this->fetch(); $rowids = array_shift($fvals); $lastvals = array_shift($fvals); foreach (array_keys($upvals, 'L') as $akey) { - $upvals[$akey] = $lastvals[$rowids[$akey]]; + $upvals[$akey] = $key_names?$lastvals[$akey]:$lastvals[$rowids[$akey]]; } } $walkfunc = create_function('&$val,$key', '$val = is_numeric(trim($val))?trim($val):"U";'); array_walk($upvals, $walkfunc); $return = null; if (count($upvals)) { - $update_cmd = 'rrdtool update '.$this->rrd_file.' N:'.implode(':', $upvals); + $update_cmd = 'rrdtool update '.$this->rrd_file.($key_names?' --template '.implode(':', array_keys($upvals)):'').' N:'.implode(':', $upvals); $return = `$update_cmd 2>&1`; } -- 2.43.0