'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; } }