CommandHandler now uses Status/HostView, fix sql IN-Query bug

This commit is contained in:
Jannis Moßhammer 2013-10-23 10:19:55 +02:00
parent 1aa4c0bb98
commit dc5182d4bf
2 changed files with 12 additions and 31 deletions

View File

@ -113,10 +113,13 @@ class TreeToSqlParser
$queryString = ''; $queryString = '';
$leftQuery = $this->nodeToSqlQuery($node->left); $leftQuery = $this->nodeToSqlQuery($node->left);
$rightQuery = $this->nodeToSqlQuery($node->right); $rightQuery = $this->nodeToSqlQuery($node->right);
if ($leftQuery != '') { if ($leftQuery != '') {
$queryString .= $leftQuery . ' '; $queryString .= $leftQuery . ' ';
} }
if ($rightQuery != '') { if ($rightQuery != '') {
$queryString .= (($queryString !== '') ? $node->type . ' ' : ' ') . $rightQuery; $queryString .= (($queryString !== '') ? $node->type . ' ' : ' ') . $rightQuery;
} }
return $queryString; return $queryString;
@ -133,6 +136,7 @@ class TreeToSqlParser
if (!$this->query->isValidFilterTarget($node->left) && $this->query->getMappedField($node->left)) { if (!$this->query->isValidFilterTarget($node->left) && $this->query->getMappedField($node->left)) {
return ''; return '';
} }
$this->query->requireColumn($node->left); $this->query->requireColumn($node->left);
$queryString = '(' . $this->query->getMappedField($node->left) . ')'; $queryString = '(' . $this->query->getMappedField($node->left) . ')';
@ -172,7 +176,7 @@ class TreeToSqlParser
$valueString = join(',', $values); $valueString = join(',', $values);
if (count($values) > 1) { if (count($values) > 1) {
return '( '. $valueString . ')'; return $query . '( '. $valueString . ')';
} }
return $query . $valueString; return $query . $valueString;
} }
@ -190,6 +194,7 @@ class TreeToSqlParser
} }
$tree->root = $tree->normalizeTree($tree->root); $tree->root = $tree->normalizeTree($tree->root);
$sql = $this->nodeToSqlQuery($tree->root); $sql = $this->nodeToSqlQuery($tree->root);
if ($this->filtersAggregate()) { if ($this->filtersAggregate()) {
$baseQuery->having($sql); $baseQuery->having($sql);
} else { } else {

View File

@ -175,45 +175,21 @@ class Monitoring_CommandController extends ActionController
if (!$hostname && !$servicename) { if (!$hostname && !$servicename) {
throw new MissingParameterException("No target given for this command"); throw new MissingParameterException("No target given for this command");
} }
if ($hostname) { if ($hostname) {
$filter["host_name"] = $hostname; $view = \Icinga\Module\Monitoring\DataView\HostStatus::fromRequest($this->getRequest());
} }
if ($servicename && !$hostOnly) { if ($servicename && !$hostOnly) {
$filter["service_description"] = $servicename; $view = \Icinga\Module\Monitoring\DataView\ServiceStatus::fromRequest($this->getRequest());
$fields[] = "service_description";
$fields[] = "service_state";
} }
$query = $view->getQuery()->from("status", $fields);
return $data = $query->fetchAll();
// Implemented manuall search because api is not ready.
// @TODO Implement this using the database api #4663 (mh)
$query = Backend::createBackend($this->_getParam('backend'))->select()->from("status", $fields);
$data = $query->fetchAll();
$out = array();
foreach ($data as $o) {
if ($o->host_name === $hostname) {
if (!$servicename) {
$out[] = (object) array(
"host_name" => $o->host_name
);
} elseif ($servicename && strtolower($o->service_description) === strtolower($servicename)) {
$out[] = (object) array(
"host_name" => $o->host_name,
"service_description" => $o->service_description
);
}
}
}
return $out;
} catch (\Exception $e) { } catch (\Exception $e) {
Logger::error( Logger::error(
"CommandController: SQL Query '%s' failed (message %s) ", "CommandController: SQL Query '%s' failed (message %s) ",
$query ? (string) $query->getQuery()->dump() : '--', $e->getMessage() $query ? (string) $query->dump() : '--', $e->getMessage()
); );
return array(); return array();
} }
} }