140 lines
4.7 KiB
PHP
140 lines
4.7 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Icinga\Backend\Statusdat;
|
||
|
abstract class GroupsummaryQuery extends Query
|
||
|
{
|
||
|
protected $reader;
|
||
|
protected $groupType = "servicegroup";
|
||
|
protected $base = "services";
|
||
|
|
||
|
protected $available_columns = array(
|
||
|
'ok' => 'SUM(CASE WHEN state = 0 THEN 1 ELSE 0 END)',
|
||
|
'critical' => 'SUM(CASE WHEN state = 2 AND downtime = 0 AND ack = 0 THEN 1 ELSE 0 END)',
|
||
|
'critical_dt' => 'SUM(CASE WHEN state = 2 AND downtime = 1 THEN 1 ELSE 0 END)',
|
||
|
'critical_ack' => 'SUM(CASE WHEN state = 2 AND downtime = 0 AND ack = 1 THEN 1 ELSE 0 END)',
|
||
|
'unknown' => 'SUM(CASE WHEN state = 3 AND downtime = 0 AND ack = 0 THEN 1 ELSE 0 END)',
|
||
|
'unknown_dt' => 'SUM(CASE WHEN state = 3 AND downtime = 1 THEN 1 ELSE 0 END)',
|
||
|
'unknown_ack' => 'SUM(CASE WHEN state = 3 AND downtime = 0 AND ack = 1 THEN 1 ELSE 0 END)',
|
||
|
'warning' => 'SUM(CASE WHEN state = 1 AND downtime = 0 AND ack = 0 THEN 1 ELSE 0 END)',
|
||
|
'warning_dt' => 'SUM(CASE WHEN state = 1 AND downtime = 1 THEN 1 ELSE 0 END)',
|
||
|
'warning_ack' => 'SUM(CASE WHEN state = 1 AND downtime = 0 AND ack = 1 THEN 1 ELSE 0 END)',
|
||
|
);
|
||
|
|
||
|
protected $order_columns = array(
|
||
|
'state' => array(
|
||
|
'ASC' => array(
|
||
|
'ok ASC',
|
||
|
'warning_dt ASC',
|
||
|
'warning_ack ASC',
|
||
|
'warning ASC',
|
||
|
'unknown_dt ASC',
|
||
|
'unknown_ack ASC',
|
||
|
'unknown ASC',
|
||
|
'critical_dt ASC',
|
||
|
'critical_ack ASC',
|
||
|
'critical ASC',
|
||
|
),
|
||
|
'DESC' => array(
|
||
|
'critical DESC',
|
||
|
'critical_ack DESC',
|
||
|
'critical_dt DESC',
|
||
|
'unknown DESC',
|
||
|
'unknown_ack DESC',
|
||
|
'unknown_dt DESC',
|
||
|
'warning DESC',
|
||
|
'warning_ack DESC',
|
||
|
'warning_dt DESC',
|
||
|
'ok DESC',
|
||
|
),
|
||
|
'default' => 'DESC'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
private function getStateType(&$obj)
|
||
|
{
|
||
|
|
||
|
if ($obj->status->current_state == 0)
|
||
|
return "ok";
|
||
|
$typeBase = "";
|
||
|
if ($obj->status->current_state == 1) {
|
||
|
$typeBase = 'warning';
|
||
|
} else if ($obj->status->current_state == 2) {
|
||
|
$typeBase = 'critical';
|
||
|
} else if ($obj->status->current_state == 3) {
|
||
|
$typeBase = 'unknown';
|
||
|
}
|
||
|
if ($obj->status->problem_has_been_acknowledged) {
|
||
|
return $typeBase . "_ack";
|
||
|
|
||
|
} else if (isset($obj->status->downtime)) {
|
||
|
return $typeBase . "_dt";
|
||
|
}
|
||
|
return $typeBase;
|
||
|
}
|
||
|
|
||
|
public function groupByProblemType(&$indices)
|
||
|
{
|
||
|
|
||
|
|
||
|
$typename = $this->groupType."_name";
|
||
|
$result = array();
|
||
|
foreach ($indices as $type=>$subIndices) {
|
||
|
|
||
|
foreach ($subIndices as $objName) {
|
||
|
|
||
|
$obj = &$this->reader->getObjectByName($type,$objName);
|
||
|
$statetype = $this->getStateType($obj);
|
||
|
foreach($obj->group as $group) {
|
||
|
if(!isset($result[$group])) {
|
||
|
$result[$group] = (object) array(
|
||
|
$typename => $group,
|
||
|
'ok' => 0,
|
||
|
'critical' => 0,
|
||
|
'critical_dt' => 0,
|
||
|
'critical_ack' => 0,
|
||
|
'unknown' => 0,
|
||
|
'unknown_dt' => 0,
|
||
|
'unknown_ack' => 0,
|
||
|
'warning' => 0,
|
||
|
'warning_dt' => 0,
|
||
|
'warning_ack' => 0
|
||
|
);
|
||
|
}
|
||
|
$result[$group]->$statetype++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return array_values($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @var \Icinga\Protocol\Statusdat\Query
|
||
|
*/
|
||
|
|
||
|
|
||
|
public function init() {
|
||
|
$this->reader = $this->backend->getReader();
|
||
|
$this->query = $this->reader->select()->from($this->base,array())->groupByFunction("groupByProblemType",$this)->where("COUNT{group} > 0");
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
public function where($column, $value = null)
|
||
|
{
|
||
|
if ($column === 'problems') {
|
||
|
if ($value === 'true') {
|
||
|
//$this->where("COUNT{downtime} == 0 AND status.problem_has_been_acknowledged == 0 AND status.current_state > 0");
|
||
|
}
|
||
|
} elseif ($column === 'search') {
|
||
|
if ($value) {
|
||
|
$this->where($this->name_alias . ' LIKE ?', '%' . $value . '%');
|
||
|
}
|
||
|
} else {
|
||
|
parent::where($column, $value);
|
||
|
}
|
||
|
return $this;
|
||
|
}
|
||
|
}
|
||
|
|