Private GIT

Skip to content
Snippets Groups Projects
Select Git revision
  • 999196c18b8d0290b991966ef710509a98bdb5d8
  • master default protected
  • MON-2693-new-menu
  • php7-migration
  • poc-redis
  • security-fix-virtual-metrics-sql
  • security-fix-reporting
  • security-fix-menu-username
  • security-fix-export-graph
  • security-fix-metrics-injection
  • security-fix-virtual-metrics
  • security-fix-curves-templates
  • security-fix-command-form
  • security-fix-administration-logs
  • clapi_filter
  • MON2733-C2_Security_fix
  • new-header-2.8.x
  • MON-2725-ldap-passwords
  • 2.8.x
  • 6073-fix-view-contact-notifications
  • MON2703-new-api-menu
  • 2.8.23
  • 2.8.22
  • 2.8.21
  • 2.8.20
  • 2.8.19
  • 2.8.18
  • 2.8.17
  • 2.8.216
  • 2.8.16
  • 2.7.13
  • 2.8.15
  • help
  • 2.8.14
  • 2.8.13
  • 2.8.12
  • 2.7.12
  • 2.8.11
  • 2.8.10
  • 2.8.10-release
  • 2.8.9
41 results

install.sh

Blame
  • 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;
        }
    }