Select Git revision
nzbSplitter.py
centreonNotification.class.php 19.42 KiB
<?php
/*
* Copyright 2005-2015 Centreon
* Centreon is developped by : Julien Mathis and Romain Le Merlus under
* GPL Licence 2.0.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation ; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, see <http://www.gnu.org/licenses>.
*
* Linking this program statically or dynamically with other modules is making a
* combined work based on this program. Thus, the terms and conditions of the GNU
* General Public License cover the whole combination.
*
* As a special exception, the copyright holders of this program give Centreon
* permission to link this program with independent modules to produce an executable,
* regardless of the license terms of these independent modules, and to copy and
* distribute the resulting executable under terms of Centreon choice, provided that
* Centreon also meet, for each linked independent module, the terms and conditions
* of the license of that module. An independent module is a module which is not
* derived from this program. If you modify this program, you may extend this
* exception to your version of the program, but you are not obliged to do so. If you
* do not wish to do so, delete this exception statement from your version.
*
* For more information : contact@centreon.com
*
*/
class CentreonNotification
{
protected $db;
protected $svcTpl;
protected $svcNotifType;
protected $svcBreak;
protected $hostNotifType;
protected $hostBreak;
const HOST = 0;
const SVC = 1;
const HOST_ESC = 2;
const SVC_ESC = 3;
/**
* Constructor
*
* @return void
*/
public function __construct($db)
{
$this->db = $db;
$this->svcTpl = array();
$this->svcNotifType = array();
$this->svcBreak = array(1 => false, 2 => false);
$this->hostNotifType = array();
$this->hostBreak = array(1 => false, 2 => false);
}
/**
* Get list of contact
*
* @return void
*/
public function getList()
{
$sql = "SELECT contact_id, contact_alias FROM contact ORDER BY contact_name";
$res = $this->db->query($sql);
$tab = array();
while ($row = $res->fetchRow()) {
$tab[$row['contact_id']] = $row['contact_alias'];
}
return $tab;
}
/**
* Checks if notification is enabled
*
* @param int $contactId
* @return bool true if notification is enabled, false otherwise
*/
protected function isNotificationEnabled($contactId)
{
$sql = "SELECT contact_enable_notifications FROM contact WHERE contact_id = " . $contactId;
$res = $this->db->query($sql);
if ($res->numRows()) {
$row = $res->fetchRow();
if ($row['contact_enable_notifications']) {
return true;
}
}
return false;
}
/**
* Get contact groups
*
* @param int $contactGroupId
* @return array
*/
public function getContactGroupsById($contactGroupId)
{
$sql = "SELECT cg_id, cg_name
FROM contactgroup cg
WHERE cg.cg_id = " . $this->db->escape($contactGroupId);
$res = $this->db->query($sql);
$tab = array();
while ($row = $res->fetchRow()) {
$tab[$row['cg_id']] = $row['cg_name'];
}
return $tab;
}
/**
* Get contact groups
*
* @param int $contactId
* @return array
*/
public function getContactGroups($contactId)
{
$sql = "SELECT cg_id, cg_name
FROM contactgroup cg, contactgroup_contact_relation ccr
WHERE cg.cg_id = ccr.contactgroup_cg_id
AND ccr.contact_contact_id = " . $contactId;
$res = $this->db->query($sql);
$tab = array();
while ($row = $res->fetchRow()) {
$tab[$row['cg_id']] = $row['cg_name'];
}
return $tab;
}
/**
* Get notifications
*
* @param int $notifType 0 for Hosts, 1 for Services, 2 for Host Escalations, 3 for Service Escalations
* @param int $contactId
* @return array
*/
public function getNotifications($notifType, $contactId)
{
$contactId = $this->db->escape($contactId);
if (false === $this->isNotificationEnabled($contactId)) {
return array();
}
$contactgroups = $this->getContactGroups($contactId);
if ($notifType == self::HOST) {
$resources = $this->getHostNotifications($contactId, $contactgroups);
} elseif ($notifType == self::SVC) {
$resources = $this->getServiceNotifications($contactId, $contactgroups);
} elseif ($notifType == self::HOST_ESC || $notifType == self::SVC_ESC) {
$resources = $this->getEscalationNotifications($notifType, $contactgroups);
}
return $resources;
}
/**
* Get notifications
*
* @param int $notifType 0 for Hosts, 1 for Services, 2 for Host Escalations, 3 for Service Escalations
* @param int $contactgroupId
* @return array
*/
public function getNotificationsContactGroup($notifType, $contactgroupId)
{
/*if (false === $this->isNotificationEnabled($contactId)) {
return array();
}*/
$contactgroups = $this->getContactGroupsById($contactgroupId);
if ($notifType == self::HOST) {
$resources = $this->getHostNotifications(-1, $contactgroups);
} elseif ($notifType == self::SVC) {
$resources = $this->getServiceNotifications(-1, $contactgroups);
} elseif ($notifType == self::HOST_ESC || $notifType == self::SVC_ESC) {
$resources = $this->getEscalationNotifications($notifType, $contactgroups);
}
return $resources;
}
/**
* Get host escalatiosn
*
* @param array $escalations
* @return array
*/
protected function getHostEscalations($escalations)
{
$escalations = implode(array_keys($escalations));
$sql = "SELECT h.host_id, h.host_name
FROM escalation_host_relation ehr, host h
WHERE h.host_id = ehr.host_host_id
AND ehr.escalation_esc_id IN (" . $escalations . ")
UNION
SELECT h.host_id, h.host_name
FROM escalation_hostgroup_relation ehr, hostgroup_relation hgr, host h
WHERE ehr.hostgroup_hg_id = hgr.hostgroup_hg_id
AND hgr.host_host_id = h.host_id
AND ehr.escalation_esc_id IN (" . $escalations . ")";
$res = $this->db->query($sql);
$tab = array();
while ($row = $res->fetchRow()) {
$tab[$row['host_id']] = $row['host_name'];
}
return $tab;
}
/**
* Get service escalations
*
* @param array $escalations
* @return array
*/
protected function getServiceEscalations($escalations)
{
$escalationsList = implode(array_keys($escalations));
$sql = "SELECT h.host_id, h.host_name, s.service_id, s.service_description
FROM escalation_service_relation esr, host h, service s
WHERE h.host_id = esr.host_host_id
AND esr.service_service_id = s.service_id
AND esr.escalation_esc_id IN (" . $escalationsList . ")
UNION
SELECT h.host_id, h.host_name, s.service_id, s.service_description
FROM escalation_servicegroup_relation esr, servicegroup_relation sgr, host h, service s
WHERE esr.servicegroup_sg_id = sgr.servicegroup_sg_id
AND sgr.host_host_id = h.host_id
AND sgr.service_service_id = s.service_id
AND esr.escalation_esc_id IN (" . $escalationsList . ")";
$res = $this->db->query($sql);
$tab = array();
while ($row = $res->fetchRow()) {
if (!isset($tab[$row['host_id']])) {
$tab[$row['host_id']] = array();
}
$tab[$row['host_id']][$row['service_id']]['host_name'] = $row['host_name'];
$tab[$row['host_id']][$row['service_id']]['service_description'] = $row['service_description'];
}
return $tab;
}
/**
* Get escalation notifications
*
* @param array $contactgroups
* @return array
*/
protected function getEscalationNotifications($notifType, $contactgroups)
{
if (!count($contactgroups)) {
return array();
}
$sql = "SELECT ecr.escalation_esc_id, e.esc_name
FROM escalation_contactgroup_relation ecr, escalation e
WHERE e.esc_id = ecr.escalation_esc_id
AND ecr.contactgroup_cg_id IN (".implode(array_keys($contactgroups)).")";
$res = $this->db->query($sql);
$escTab = array();
while ($row = $res->fetchRow()) {
$escTab[$row['escalation_esc_id']] = $row['esc_name'];
}
if (!count($escTab)) {
return array();
}
if ($notifType == self::HOST_ESC) {
return $this->getHostEscalations($escTab);
} else {
return $this->getServiceEscalations($escTab);
}
}
/**
* Get Host Notifications
*
* @param int $contactId
* @param array $contactgroups
* @return array
*/
protected function getHostNotifications($contactId, $contactgroups)
{
$sql = "SELECT host_id, host_name, host_register, 1 as notif_type
FROM contact_host_relation chr, host h
WHERE chr.contact_id = " . $contactId . "
AND chr.host_host_id = h.host_id ";
if (count($contactgroups)) {
$sql .= " UNION
SELECT host_id, host_name, host_register, 2 as notif_type
FROM contactgroup_host_relation chr, host h
WHERE chr.contactgroup_cg_id IN (" . implode(',', array_keys($contactgroups)) . ")
AND chr.host_host_id = h.host_id ";
}
$res = $this->db->query($sql);
$hostTab = array();
$templates = array();
while ($row = $res->fetchRow()) {
if ($row['host_register'] == 1) {
$hostTab[$row['host_id']] = $row['host_name'];
} else {
$templates[$row['host_id']] = $row['host_name'];
$this->hostNotifType[$row['host_id']] = $row['notif_type'];
}
}
unset($res);
if (count($hostTab)) {
$sql2 = "SELECT host_id, host_name
FROM host
WHERE host_id NOT IN (" . implode(',', array_keys($hostTab)) . ") AND host_register = '1'";
} else {
$sql2 = "SELECT host_id, host_name FROM host WHERE host_register = '1'";
}
$res2 = $this->db->query(trim($sql2));
while ($row = $res2->fetchRow()) {
$this->hostBreak = array(1 => false, 2 => false);
if ($this->getHostTemplateNotifications($row['host_id'], $templates) === true) {
$hostTab[$row['host_id']] = $row['host_name'];
}
}
return $hostTab;
}
/**
* Recursive method
*
* @param int $hostId
* @param array $templates
* @return bool
*/
protected function getHostTemplateNotifications($hostId, $templates)
{
$sql = "SELECT htr.host_tpl_id, ctr.contact_id, ctr2.contactgroup_cg_id
FROM host_template_relation htr
LEFT JOIN contact_host_relation ctr ON htr.host_host_id = ctr.host_host_id
LEFT JOIN contactgroup_host_relation ctr2 ON htr.host_host_id = ctr2.host_host_id
WHERE htr.host_host_id = " . $hostId . "
ORDER BY `order`";
$res = $this->db->query($sql);
while ($row = $res->fetchRow()) {
if ($row['contact_id']) {
$this->hostBreak[1] = true;
}
if ($row['contactgroup_cg_id']) {
$this->hostBreak[2] = true;
}
if (isset($templates[$row['host_tpl_id']])) {
if ($this->hostNotifType[$row['host_tpl_id']] == 1 && $this->hostBreak[1] == true) {
return false;
}
if ($this->hostNotifType[$row['host_tpl_id']] == 2 && $this->hostBreak[2] == true) {
return false;
}
return true;
}
return $this->getHostTemplateNotifications($row['host_tpl_id'], $templates);
}
return false;
}
/**
* Get Service notifications
*
* @param int $contactId
* @param array $contactGroups
* @return array
*/
protected function getServiceNotifications($contactId, $contactGroups)
{
$sql = "SELECT h.host_id, h.host_name, s.service_id, s.service_description, s.service_register, 1 as notif_type
FROM contact_service_relation csr, service s
LEFT JOIN host_service_relation hsr ON hsr.service_service_id = s.service_id
LEFT JOIN host h ON h.host_id = hsr.host_host_id
WHERE csr.contact_id = " . $contactId . "
AND csr.service_service_id = s.service_id
UNION
SELECT h.host_id, h.host_name, s.service_id, s.service_description, s.service_register, 1 as notif_type
FROM contact_service_relation csr, service s, host h, host_service_relation hsr, hostgroup_relation hgr
WHERE csr.contact_id = " . $contactId . "
AND csr.service_service_id = s.service_id
AND s.service_id = hsr.service_service_id
AND hsr.hostgroup_hg_id = hgr.hostgroup_hg_id
AND hgr.host_host_id = h.host_id ";
if (count($contactGroups)) {
$contactGroups = implode(',', array_keys($contactGroups));
$sql .= " UNION
SELECT h.host_id, h.host_name, s.service_id, s.service_description, s.service_register,
2 as notif_type
FROM contactgroup_service_relation csr, service s
LEFT JOIN host_service_relation hsr ON hsr.service_service_id = s.service_id
LEFT JOIN host h ON h.host_id = hsr.host_host_id
WHERE csr.contactgroup_cg_id IN (" . $contactGroups . ")
AND csr.service_service_id = s.service_id
UNION
SELECT h.host_id, h.host_name, s.service_id, s.service_description, s.service_register,
2 as notif_type
FROM contactgroup_service_relation csr, service s, host h, host_service_relation hsr,
hostgroup_relation hgr
WHERE csr.contactgroup_cg_id IN (" . $contactGroups . ")
AND csr.service_service_id = s.service_id
AND s.service_id = hsr.service_service_id
AND hsr.hostgroup_hg_id = hgr.hostgroup_hg_id
AND hgr.host_host_id = h.host_id ";
}
$res = $this->db->query($sql);
$svcTab = array();
$svcList = array();
$templates = array();
while ($row = $res->fetchRow()) {
$svcList[$row['service_id']]=$row['service_id'];
if ($row['service_register'] == 1) {
if (!isset($svcTab[$row['host_id']])) {
$svcTab[$row['host_id']] = array();
}
$svcTab[$row['host_id']][$row['service_id']] = array();
$svcTab[$row['host_id']][$row['service_id']]['host_name'] = $row['host_name'];
$svcTab[$row['host_id']][$row['service_id']]['service_description'] = $row['service_description'];
} else {
$templates[$row['service_id']] = $row['service_description'];
$this->svcNotifType[$row['service_id']] = $row['notif_type'];
}
}
unset($res);
if (count($svcTab)) {
$tab = array();
foreach ($svcTab as $tmp) {
$tab = array_merge(array_keys($tmp), $tab);
}
$sql2 = "SELECT service_id, service_description
FROM service
WHERE service_id NOT IN (".implode(',', $tab).") AND service_register = '1'";
} else {
$sql2 = "SELECT service_id, service_description
FROM service
WHERE service_register = '1'";
}
$res2 = $this->db->query($sql2);
$sql3 = "SELECT h.host_id, h.host_name, hsr.service_service_id as service_id
FROM host h, host_service_relation hsr
WHERE h.host_id = hsr.host_host_id
UNION
SELECT h.host_id, h.host_name, hsr.service_service_id
FROM host h, host_service_relation hsr, hostgroup_relation hgr
WHERE h.host_id = hgr.host_host_id
AND hgr.hostgroup_hg_id = hsr.hostgroup_hg_id";
$res3 = $this->db->query($sql3);
while ($row3 = $res3->fetchRow()) {
$list[$row3['service_id']] = $row3;
}
while ($row = $res2->fetchRow()) {
$this->svcBreak = array(1 => false, 2 => false);
$flag = false;
if ($this->getServiceTemplateNotifications($row['service_id'], $templates) === true ) {
if (array_key_exists($row['service_id'], $list)) {
$row3 = $list[$row['service_id']];
if (!isset($svcTab[$row3['host_id']])) {
$svcTab[$row3['host_id']] = array();
}
$svcTab[$row3['host_id']][$row['service_id']] = array();
$svcTab[$row3['host_id']][$row['service_id']]['host_name'] = $row3['host_name'];
$svcTab[$row3['host_id']][$row['service_id']]['service_description'] = $row['service_description'];
}
}
}
return $svcTab;
}
/**
* Recursive method
*
* @param int $serviceId
* @param array $templates
* @return bool
*/
protected function getServiceTemplateNotifications($serviceId, $templates)
{
$tplId = 0;
if (!isset($this->svcTpl[$serviceId])) {
$sql = "SELECT s.service_template_model_stm_id, csr.contact_id, csr2.contactgroup_cg_id
FROM service s
LEFT JOIN contact_service_relation csr ON csr.service_service_id = s.service_id
LEFT JOIN contactgroup_service_relation csr2 ON csr2.service_service_id = s.service_id
WHERE service_id = ".$this->db->escape($serviceId);
$res = $this->db->query($sql);
$row = $res->fetchRow();
$tplId = $row['service_template_model_stm_id'];
} else {
$tplId = $this->svcTpl[$serviceId];
}
if ($row['contact_id']) {
$this->svcBreak[1] = true;
}
if ($row['contactgroup_cg_id']) {
$this->svcBreak[2] = true;
}
if (isset($templates[$tplId]) && $templates[$tplId]) {
if ($this->svcNotifType[$tplId] == 1 && $this->svcBreak[1] == true) {
return false;
}
if ($this->svcNotifType[$tplId] == 2 && $this->svcBreak[2] == true) {
return false;
}
return true;
}
if ($tplId) {
return $this->getServiceTemplateNotifications($tplId, $templates);
}
return false;
}
}