$v) {
if(!is_dir($CONFIG['datadir'].'/'.$v))
unset($dir[$k]);
}
return $dir;
}
# return files in directory. this will recurse into subdirs
# infinite loop may occur
function get_host_rrd_files($dir) {
$files = array();
$objects = new RegexIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir),
RecursiveIteratorIterator::SELF_FIRST),
'/\.rrd$/');
foreach($objects as $object) {
$relativePathName = str_replace($dir.'/', '', $object->getPathname());
if (!preg_match('/^.+\/.+\.rrd$/', $relativePathName))
continue;
$files[] = $relativePathName;
}
return $files;
}
# returns an array of plugins/pinstances/types/tinstances
function collectd_plugindata($host, $plugin=NULL) {
global $CONFIG;
if (!is_dir($CONFIG['datadir'].'/'.$host))
return false;
$hostdir = $CONFIG['datadir'].'/'.$host;
if (!$files = get_host_rrd_files($hostdir))
return false;
$data = array();
foreach($files as $item) {
preg_match('`
(?P
[\w_]+) # plugin
(?:(?<=varnish)(?:\-(?P[\w]+)))? # category
(?:\-(?P.+))? # plugin instance
/
(?P[\w_]+) # type
(?:\-(?P.+))? # type instance
\.rrd
`x', $item, $matches);
$data[] = array(
'p' => $matches['p'],
'c' => isset($matches['c']) ? $matches['c'] : '',
'pi' => isset($matches['pi']) ? $matches['pi'] : '',
't' => $matches['t'],
'ti' => isset($matches['ti']) ? $matches['ti'] : '',
);
}
# only return data about one plugin
if (!is_null($plugin)) {
$pdata = array();
foreach($data as $item) {
if ($item['p'] == $plugin)
$pdata[] = $item;
}
$data = $pdata;
}
return $data ? $data : false;
}
# returns an array of all plugins of a host
function collectd_plugins($host) {
if (!$plugindata = collectd_plugindata($host))
return false;
$plugins = array();
foreach ($plugindata as $item) {
if (!in_array($item['p'], $plugins))
$plugins[] = $item['p'];
}
sort($plugins);
return $plugins ? $plugins : false;
}
# returns an array of all pi/t/ti of an plugin
function collectd_plugindetail($host, $plugin, $detail, $where=NULL) {
$details = array('pi', 'c', 't', 'ti');
if (!in_array($detail, $details))
return false;
if (!$plugindata = collectd_plugindata($host))
return false;
$return = array();
foreach ($plugindata as $item) {
if ($item['p'] == $plugin && !in_array($item[$detail], $return) && isset($item[$detail])) {
if ($where) {
$add = true;
# add detail to returnvalue if all where is true
foreach($where as $key => $value) {
if ($item[$key] != $value)
$add = false;
}
if ($add)
$return[] = $item[$detail];
} else {
$return[] = $item[$detail];
}
}
}
return $return ? $return : false;
}
# group plugin files for graph generation
function group_plugindata($plugindata) {
global $CONFIG;
$data = array();
# type instances should be grouped in 1 graph
foreach ($plugindata as $item) {
# backwards compatibility
if ($CONFIG['version'] >= 5 || !preg_match('/^(df|interface)$/', $item['p']))
if (!(
$item['p'] == 'libvirt'
|| ($item['p'] == 'snmp' && $item['t'] == 'if_octets')
|| ($item['p'] == 'vmem' && $item['t'] == 'vmpage_io')
))
unset($item['ti']);
$data[] = $item;
}
# remove duplicates
$data = array_map("unserialize", array_unique(array_map("serialize", $data)));
return $data;
}
function plugin_sort($data) {
if (empty($data))
return $data;
foreach ($data as $key => $row) {
$pi[$key] = (isset($row['pi'])) ? $row['pi'] : null;
$c[$key] = (isset($row['c'])) ? $row['c'] : null;
$ti[$key] = (isset($row['ti'])) ? $row['ti'] : null;
$t[$key] = (isset($row['t'])) ? $row['t'] : null;
}
array_multisort($c, SORT_ASC, $pi, SORT_ASC, $t, SORT_ASC, $ti, SORT_ASC, $data);
return $data;
}
function parse_typesdb_file($file = array('/usr/share/collectd/types.db')) {
if (!is_array($file))
$file = array($file);
if (!file_exists($file[0]))
$file[0] = 'inc/types.db';
$types = array();
foreach ($file as $single_file)
{
if (!file_exists($single_file))
continue;
foreach (file($single_file) as $type) {
if(!preg_match('/^(?P[\w_]+)\s+(?P.*)/', $type, $matches))
continue;
$dataset = $matches['dataset'];
$datasources = explode(', ', $matches['datasources']);
foreach ($datasources as $ds) {
if (!preg_match('/^(?P\w+):(?P[\w]+):(?P[\-\dU\.]+):(?P[\dU\.]+)/', $ds, $matches))
error_log(sprintf('CGP Error: DS "%s" from dataset "%s" did not match', $ds, $dataset));
$types[$dataset][$matches['dsname']] = array(
'dstype' => $matches['dstype'],
'min' => $matches['min'],
'max' => $matches['max'],
);
}
}
}
return $types;
}