* @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} namespace Icinga\Backend\Statusdat; abstract class GroupsummaryQuery extends Query { /** * @var mixed */ protected $reader; /** * @var string */ protected $groupType = "servicegroup"; /** * @var string */ protected $base = "services"; /** * @var array */ 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)', ); /** * @var array */ 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' ) ); /** * @param $obj * @return string */ 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; } /** * @param $indices * @return array */ 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 * @return mixed|void */ public function init() { $this->reader = $this->backend->getReader(); $this->query = $this->reader->select()->from($this->base, array())->groupByFunction( "groupByProblemType", $this )->where("COUNT{group} > 0"); } /** * @param The $column * @param null $value * @return $this|Query */ 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; } }