summaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:25:24 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-14 13:25:24 +0000
commitd76d47b12fdcc9e127d023661e806cf2ca8e7715 (patch)
tree52c73718c9e2b6e4aa3f997791786aa2ee6ebcc9 /library
parentInitial commit. (diff)
downloadicingaweb2-module-nagvis-d76d47b12fdcc9e127d023661e806cf2ca8e7715.tar.xz
icingaweb2-module-nagvis-d76d47b12fdcc9e127d023661e806cf2ca8e7715.zip
Adding upstream version 1.1.1.upstream/1.1.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library')
-rw-r--r--library/Nagvis/RestrictionHelper.php41
-rw-r--r--library/nagvis-includes/CoreAuthModIcingaweb2.php129
-rw-r--r--library/nagvis-includes/CoreAuthorisationModIcingaweb2.php183
-rw-r--r--library/nagvis-includes/CoreLogonIcingaweb2.php22
-rw-r--r--library/nagvis-includes/GlobalBackendicingaweb2.php1242
-rw-r--r--library/nagvis-includes/TODO.md1
-rw-r--r--library/nagvis-includes/init.inc.php3
7 files changed, 1621 insertions, 0 deletions
diff --git a/library/Nagvis/RestrictionHelper.php b/library/Nagvis/RestrictionHelper.php
new file mode 100644
index 0000000..a757b9d
--- /dev/null
+++ b/library/Nagvis/RestrictionHelper.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Icinga\Module\Nagvis;
+
+use Icinga\Authentication\Auth;
+
+/**
+ * NagVis restriction helper
+ */
+class RestrictionHelper
+{
+ /**
+ * Get the regular expression for validating map names
+ *
+ * @return string|null
+ */
+ public static function getRegex()
+ {
+ $mapFilters = array();
+ foreach (Auth::getInstance()->getRestrictions('nagvis/map/filter') as $mapFilter) {
+ if ($mapFilter !== '') {
+ $mapFilters = array_merge($mapFilters, array_map('trim', explode(',', $mapFilter)));
+ }
+ }
+
+ if (! empty($mapFilters)) {
+ $mapRegexParts = array();
+ foreach (array_unique($mapFilters) as $mapFilter) {
+ $nonWildcards = array();
+ foreach (explode('*', $mapFilter) as $nonWildcard) {
+ $nonWildcards[] = preg_quote($nonWildcard, '/');
+ }
+ $mapRegexParts[] = implode('.*', $nonWildcards);
+ }
+
+ return '/^(?:' . implode('|', $mapRegexParts) . ')$/i';
+ }
+
+ return null;
+ }
+}
diff --git a/library/nagvis-includes/CoreAuthModIcingaweb2.php b/library/nagvis-includes/CoreAuthModIcingaweb2.php
new file mode 100644
index 0000000..da04298
--- /dev/null
+++ b/library/nagvis-includes/CoreAuthModIcingaweb2.php
@@ -0,0 +1,129 @@
+<?php
+
+use Icinga\Application\Icinga;
+use Icinga\Authentication\Auth;
+
+class CoreAuthModIcingaweb2 extends CoreAuthModule
+{
+ private $app;
+ private $auth;
+ private $user;
+
+ private $iUserId = -1;
+ private $sUsername = '';
+ private $sPassword = '';
+ private $sPasswordnew = '';
+ private $sPasswordHash = '';
+
+ public function __construct()
+ {
+ parent::$aFeatures = array(
+ // General functions for authentication
+ 'passCredentials' => false,
+ 'getCredentials' => false,
+ 'isAuthenticated' => true,
+ 'getUser' => true,
+ 'getUserId' => true,
+
+ // Changing passwords
+ 'passNewPassword' => false,
+ 'changePassword' => false,
+ 'passNewPassword' => false,
+
+ // Managing users
+ 'createUser' => false,
+ );
+
+ $oldname = session_name();
+ session_write_close();
+ $old_path = ini_get('session.cookie_path');
+ $old_id = session_id();
+ $cacheLimiter = ini_get('session.cache_limiter');
+ ini_set('session.use_cookies', false);
+ ini_set('session.use_only_cookies', false);
+ ini_set('session.cache_limiter', null);
+ ini_set('session.cookie_path', '/');
+ $icookie = 'Icingaweb2';
+ if (isset($_COOKIE[$icookie])) {
+ session_id($_COOKIE[$icookie]);
+ }
+
+ $this->app = Icinga::app();
+ $this->auth = Auth::getInstance();
+ if ($this->auth->isAuthenticated()) {
+ $this->user = $this->auth->getUser();
+ }
+ ini_set('session.cookie_path', $old_path);
+ session_id($old_id);
+ session_name($oldname);
+ ini_set('session.use_cookies', true);
+ ini_set('session.use_only_cookies', true);
+ ini_set('session.cache_limiter', $cacheLimiter);
+ }
+
+ public function getAllUsers()
+ {
+ die('getAllUsers');
+ return array();
+ // assoc -> userId, name
+ }
+
+ public function checkUserExists($name)
+ {
+ return true;
+ }
+
+ private function updatePassword()
+ {
+ return true;
+ }
+
+ private function addUser($user, $hash)
+ {
+ return true;
+ }
+
+ public function passCredentials($aData)
+ {
+ // die('pass ' . print_r($aData, 1));
+ // eventually has user, password and passwordHash
+ }
+
+ public function passNewPassword($aData)
+ {
+ // die('new pass');
+ // eventually has user, password and passwordHash
+ }
+
+ public function getCredentials()
+ {
+ return Array('user' => $this->getUser(),
+ 'passwordHash' => null,
+ 'userId' => $this->getUserId());
+ }
+
+ public function createUser($user, $password)
+ {
+ return false;
+ }
+
+ public function changePassword()
+ {
+ return false;
+ }
+
+ public function isAuthenticated($bTrustUsername = AUTH_NOT_TRUST_USERNAME)
+ {
+ return $this->user !== null;
+ }
+
+ public function getUser()
+ {
+ return $this->user->getUsername();
+ }
+
+ public function getUserId()
+ {
+ return $this->getUser();
+ }
+}
diff --git a/library/nagvis-includes/CoreAuthorisationModIcingaweb2.php b/library/nagvis-includes/CoreAuthorisationModIcingaweb2.php
new file mode 100644
index 0000000..111ecba
--- /dev/null
+++ b/library/nagvis-includes/CoreAuthorisationModIcingaweb2.php
@@ -0,0 +1,183 @@
+<?php
+
+use Icinga\Application\Icinga;
+use Icinga\Authentication\Auth;
+use Icinga\Module\Nagvis\RestrictionHelper;
+
+class CoreAuthorisationModIcingaweb2 extends CoreAuthorisationModule
+{
+ public $rolesConfigurable = false;
+
+ private $auth;
+
+ public function __construct()
+ {
+ $this->auth = Auth::getInstance();
+ }
+
+ public function parsePermissions($sUsername = null)
+ {
+ global $CORE;
+
+ if ($sUsername !== null) {
+ die('parsePermissions() with username is not supported');
+ }
+
+ $perms = array(
+ 'General' => array('*' => array('*' => true)),
+ 'User' => array('setOption' => array('*' => true)),
+ 'Search' => array('view' => array('*' => true)),
+ 'Rotation' => array('view' => array('*' => true))
+ );
+
+ $restriction = RestrictionHelper::getRegex();
+ if ($restriction !== null) {
+ $maps = array();
+ foreach ($CORE->getAvailableMaps($restriction) as $map) {
+ $maps[$map] = true;
+ }
+ if (! empty($maps)) {
+ $perms['Map'] = array('view' => $maps);
+ }
+ } else {
+ $perms['Map'] = array('view' => array('*' => true));
+ }
+
+ if ($this->auth->hasPermission('nagvis/overview')) {
+ $perms['Overview'] = array('view' => array('*' => true));
+ }
+
+ // Never allowed:
+ // ChangePassword - change
+ // Auth - logout
+ // UserMgmt - manage
+ // RoleMgmt - manage
+ // Action - perform - *
+
+ if ($this->auth->hasPermission('nagvis/edit')) {
+ $perms['ManageShapes'] = array('manage' => array('*' => true));
+ $perms['ManageBackgrounds'] = array('manage' => array('*' => true));
+ $perms['Overview']['edit'] = array('*' => true);
+ $perms['Map']['add'] = array('*' => true);
+ $perms['Map']['edit'] = array('*' => true);
+ $perms['Map']['manage'] = array('*' => true);
+ }
+
+ if ($this->auth->hasPermission('nagvis/admin')) {
+ $perms['MainCfg'] = array('edit' => array('*' => true));
+ }
+
+ return $perms;
+ }
+
+ public function getUserRoles($userId)
+ {
+ // $userId is now the username
+ return array();
+ die("getUserRoles($userId)");
+ return array(0 => array('name' => 'Administrators'));
+ // [ { roleId, name }, ... ]
+ }
+
+ public function getAllRoles()
+ {
+ // die('getAllRoles');
+ // User menu -> Manage Users
+ return array();
+ // [ { roleId, name }, ... ]
+ }
+
+
+ // I want to get rid of those :(
+
+ public function isPermitted($sModule, $sAction, $sObj = null)
+ {
+ die("isPermitted($sModule, $sAction, $sObj) - should never be called");
+ return false;
+ }
+
+ public function deletePermission($mod, $name)
+ {
+ return false;
+ // $mod -> Map, Rotation
+ }
+
+ public function createPermission($mod, $name)
+ {
+ return false;
+ }
+
+ public function roleUsedBy($roleId)
+ {
+ die("roleUsedBy($roleId)");
+ return array();
+ // [ name , ... ]
+ }
+
+ public function deleteRole($roleId)
+ {
+ return false;
+ }
+
+ public function deleteUser($userId)
+ {
+ return false;
+ }
+
+ public function updateUserRoles($userId, $roles)
+ {
+ return false;
+ // roles = [roleId, ...]
+ }
+
+
+ public function getRoleId($sRole)
+ {
+ die("getRoleId($sRole)");
+ return 0;
+ }
+
+ public function getAllPerms()
+ {
+ die('getAllPerms');
+ return array();
+ // [ { permId, mod, act, obj }, ... ]
+ }
+
+ public function getRolePerms($roleId) {
+ die("getRolePerms($roleId)");
+ return array();
+ // [ permId => true, ... ]
+ }
+
+ public function updateRolePerms($roleId, $perms)
+ {
+ // $perms = [ permId, ... ]
+ return false;
+ }
+
+ public function checkRoleExists($name)
+ {
+ die("checkRoleExists($name)");
+ return false;
+ }
+
+ public function createRole($name)
+ {
+ die("createRole($name)");
+ return true;
+ }
+
+
+ private function checkUserExistsById($id)
+ {
+ die('checkUserExistsById');
+ return false;
+ }
+
+ public function getUserId($sUsername)
+ {
+ die('getUserId');
+ return 0;
+ }
+}
diff --git a/library/nagvis-includes/CoreLogonIcingaweb2.php b/library/nagvis-includes/CoreLogonIcingaweb2.php
new file mode 100644
index 0000000..4602bba
--- /dev/null
+++ b/library/nagvis-includes/CoreLogonIcingaweb2.php
@@ -0,0 +1,22 @@
+<?php
+
+class CoreLogonIcingaweb2 extends CoreLogonModule
+{
+ public function check($printErr = true)
+ {
+ global $AUTH, $CORE;
+ if ($AUTH->isAuthenticated()) {
+ $AUTH->setTrustUsername(true);
+ $AUTH->setLogoutPossible(false);
+ return true;
+ } else {
+ // ??? ...
+ die('not authenticated');
+ // ...
+ header('Location: /icingaweb');
+ exit;
+ // ... ???
+ return false;
+ }
+ }
+}
diff --git a/library/nagvis-includes/GlobalBackendicingaweb2.php b/library/nagvis-includes/GlobalBackendicingaweb2.php
new file mode 100644
index 0000000..1168e0a
--- /dev/null
+++ b/library/nagvis-includes/GlobalBackendicingaweb2.php
@@ -0,0 +1,1242 @@
+<?php
+
+class GlobalBackendicingaweb2 implements GlobalBackendInterface {
+ private $CONN;
+ private $backendId;
+ private $dbName;
+ private $dbUser;
+ private $dbPass;
+ private $dbHost;
+ private $dbPrefix;
+ private $dbInstanceName;
+ private $dbInstanceId;
+ private $objConfigType;
+
+ private $hostCache;
+ private $serviceCache;
+ private $hostAckCache;
+
+ // Define the backend local configuration options
+ private static $validConfig = Array(
+ 'dbhost' => Array('must' => 1,
+ 'editable' => 1,
+ 'default' => 'localhost',
+ 'match' => MATCH_STRING_NO_SPACE),
+ 'dbport' => Array('must' => 0,
+ 'editable' => 1,
+ 'default' => '3306',
+ 'match' => MATCH_INTEGER),
+ 'dbname' => Array('must' => 1,
+ 'editable' => 1,
+ 'default' => 'nagios',
+ 'match' => MATCH_STRING_NO_SPACE),
+ 'dbuser' => Array('must' => 1,
+ 'editable' => 1,
+ 'default' => 'root',
+ 'match' => MATCH_STRING_NO_SPACE),
+ 'dbpass' => Array('must' => 0,
+ 'editable' => 1,
+ 'default' => '',
+ 'match' => MATCH_STRING_EMPTY),
+ 'dbprefix' => Array('must' => 0,
+ 'editable' => 1,
+ 'default' => 'nagios_',
+ 'match' => MATCH_STRING_NO_SPACE_EMPTY),
+ 'dbinstancename' => Array('must' => 0,
+ 'editable' => 1,
+ 'default' => 'default',
+ 'match' => MATCH_STRING_NO_SPACE),
+ 'maxtimewithoutupdate' => Array('must' => 0,
+ 'editable' => 1,
+ 'default' => '180',
+ 'match' => MATCH_INTEGER));
+
+ /**
+ * Constructor
+ * Reads needed configuration parameters, connects to the Database
+ * and checks that Nagios is running
+ *
+ * @param config $MAINCFG
+ * @param String $backendId
+ * @author Andreas Husch <downanup@nagios-wiki.de>
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function __construct($backendId) {
+ $this->backendId = $backendId;
+
+ $this->hostCache = Array();
+ $this->serviceCache = Array();
+ $this->hostAckCache = Array();
+
+ $this->dbName = cfg('backend_'.$backendId, 'dbname');
+ $this->dbUser = cfg('backend_'.$backendId, 'dbuser');
+ $this->dbPass = cfg('backend_'.$backendId, 'dbpass');
+ $this->dbHost = cfg('backend_'.$backendId, 'dbhost');
+ $this->dbPort = cfg('backend_'.$backendId, 'dbport');
+ $this->dbPrefix = cfg('backend_'.$backendId, 'dbprefix');
+ $this->dbInstanceName = cfg('backend_'.$backendId, 'dbinstancename');
+
+ if($this->checkMysqlSupport() && $this->connectDB()) {
+ // Set the instanceId
+ $this->dbInstanceId = $this->getInstanceId();
+
+ // Do some checks to make sure that Nagios is running and the Data at the DB is ok
+ $QUERYHANDLE = $this->mysqlQuery('SELECT is_currently_running, UNIX_TIMESTAMP(status_update_time) AS status_update_time FROM '.$this->dbPrefix.'programstatus WHERE instance_id='.$this->dbInstanceId);
+ $nagiosstate = mysql_fetch_array($QUERYHANDLE);
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ // Check that Nagios reports itself as running
+ if ($nagiosstate['is_currently_running'] != 1) {
+ throw new BackendConnectionProblem(l('nagiosNotRunning', Array('BACKENDID' =>$this->backendId)));
+ }
+
+ // Be suspicious and check that the data at the db is not older that "maxTimeWithoutUpdate" too
+ if($_SERVER['REQUEST_TIME'] - $nagiosstate['status_update_time'] > cfg('backend_'.$backendId, 'maxtimewithoutupdate')) {
+ throw new BackendConnectionProblem(l('nagiosDataNotUpToDate', Array('BACKENDID' => $this->backendId, 'TIMEWITHOUTUPDATE' => cfg('backend_'.$backendId, 'maxtimewithoutupdate'))));
+ }
+
+ /**
+ * It looks like there is a problem with the config_type value at some
+ * installations. The NDO docs and mailinglist say that the flag
+ * config_type marks the objects as being read from retention data or read
+ * from configuration. Until NagVis 1.3b3 only objects with config_type=1
+ * were queried.
+ * Cause of some problem reports that there are NO objects with
+ * config_type=1 in the DB this check was added. If there is at least one
+ * object with config_type=1 NagVis only recognizes objects with that
+ * value set. If there is no object with config_type=1 all objects with
+ * config_type=0 are recognized.
+ *
+ * http://www.nagios-portal.de/wbb/index.php?page=Thread&threadID=9269
+ */
+ if($this->checkConfigTypeObjects()) {
+ $this->objConfigType = 1;
+ } else {
+ $this->objConfigType = 0;
+ }
+ } else {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * PUBLIC Method getValidConfig
+ *
+ * Returns the valid config for this backend
+ *
+ * @return Array
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public static function getValidConfig() {
+ return self::$validConfig;
+ }
+
+ /**
+ * PUBLIC Method getObjects
+ *
+ * Return the objects configured at Nagios which are matching the given pattern.
+ * This is needed for WUI, e.g. to populate drop down lists.
+ *
+ * @param string $type, string $name1Pattern, string $name2Pattern
+ * @return array $ret
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ * @author Andreas Husch <downanup@nagios-wiki.de>
+ */
+ public function getObjects($type,$name1Pattern='',$name2Pattern='') {
+ $ret = Array();
+ $filter = '';
+ $query = $this->backend->select();
+ switch($type) {
+ case 'host':
+ $query->from('hostStatus', array(
+ 'name1' => 'host_name'
+ ));
+ $objectType = 1;
+ if($name1Pattern != '') {
+ $filter = ' name1=\''.$name1Pattern.'\' AND ';
+ }
+ break;
+ case 'service':
+ $objectType = 2;
+
+ if($name1Pattern != '' && $name2Pattern != '') {
+ $filter = ' name1=\''.$name1Pattern.'\' AND name2=\''.$name2Pattern.'\' AND ';
+ } else if($name1Pattern != '') {
+ $filter = ' name1=\''.$name1Pattern.'\' AND ';
+ }
+ break;
+ case 'hostgroup':
+ $objectType = 3;
+
+ if($name1Pattern != '') {
+ $filter = ' name1=\''.$name1Pattern.'\' AND ';
+ }
+ break;
+ case 'servicegroup':
+ $objectType = 4;
+
+ if($name1Pattern != '') {
+ $filter = ' name1=\''.$name1Pattern.'\' AND ';
+ }
+ break;
+ default:
+ return Array();
+ break;
+ }
+
+ /**
+ * is_active default value is 0.
+ * When broker option is -1 or BROKER_RETENTION_DATA is activated the
+ * current objects have is_active=1 and the deprecated object have
+ * is_active=0. Workaround: Check if there is any is_active=1, then use the
+ * is_active filter.
+ *
+ * For details see:
+ * https://sourceforge.net/tracker/index.php?func=detail&aid=1839631&group_id=132019&atid=725179
+ * http://www.nagios-portal.de/forum/thread.php?postid=59971#post59971
+ */
+ if($this->checkForIsActiveObjects()) {
+ $isActiveFilter = ' is_active=1 AND';
+ } else {
+ $isActiveFilter = '';
+ }
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT name1,name2 FROM '.$this->dbPrefix.'objects WHERE objecttype_id='.$objectType.' AND '.$filter.$isActiveFilter.' instance_id='.$this->dbInstanceId.' ORDER BY name1');
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ $ret[] = Array('name1' => $data['name1'],'name2' => $data['name2']);
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $ret;
+ }
+
+ /**
+ * PUBLIC Method getObjectsEx
+ *
+ * Return all objects configured at Nagios plus some additional information.
+ * This is needed for gmap, e.g. to populate lists.
+ *
+ * @param string $type
+ * @return array $ret
+ * @author Roman Kyrylych <rkyrylych@op5.com>
+ */
+ public function getObjectsEx($type) {
+ $ret = Array();
+
+ return $ret;
+ }
+
+ /**
+ * PRIVATE Method checkForIsActiveObjects
+ *
+ * Checks if there are some object records with is_active=1
+ *
+ * @return Boolean
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ private function checkForIsActiveObjects() {
+ if(mysql_num_rows($this->mysqlQuery('SELECT object_id FROM '.$this->dbPrefix.'objects WHERE is_active=1')) > 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+
+ /**
+ * PRIVATE Method checkConfigTypeObjects
+ *
+ * Checks if there are some object records with config_type=1
+ *
+ * @return Boolean
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ private function checkConfigTypeObjects() {
+ if(mysql_num_rows($this->mysqlQuery('SELECT host_id FROM '.$this->dbPrefix.'hosts WHERE config_type=1 AND instance_id='.$this->dbInstanceId.' LIMIT 1')) > 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+
+ /**
+ * PRIVATE parseFilter()
+ *
+ * Parses the filter array to backend
+ *
+ * @param Array List of objects to query
+ * @param Array List of filters to apply
+ * @param String Table to use for filtering
+ * @param Boolean Split the filter by options
+ * @return String Parsed filters
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ private function parseFilter($objects, $filters, $table, $childTable, $isMemberQuery = false,
+ $isCountQuery = false, $isHostQuery = true) {
+ $aFilters = Array();
+ foreach($objects AS $OBJS) {
+ $objFilters = Array();
+ foreach($filters AS $filter) {
+ // Array('key' => 'host_name', 'operator' => '=', 'name'),
+ switch($filter['key']) {
+ case 'host_name':
+ case 'host_groups':
+ case 'service_groups':
+ case 'hostgroup_name':
+ case 'group_name':
+ case 'groups':
+ case 'servicegroup_name':
+ case 'service_description':
+ if($filter['key'] != 'service_description')
+ $val = $OBJS[0]->getName();
+ else
+ $val = $OBJS[0]->getServiceDescription();
+
+ // Translate field names
+ if($filter['key'] == 'service_description')
+ $filter['key'] = 'name2';
+ else
+ $filter['key'] = 'name1';
+
+ if($filter['op'] == '>=')
+ $filter['op'] = '=';
+
+ $objFilters[] = ' '.$table.'.'.$filter['key']." ".$filter['op']." binary '".$val."' ";
+ break;
+ default:
+ throw new BackendConnectionProblem('Invalid filter key ('.$filter['key'].')');
+ break;
+ }
+ }
+
+ // Are there child exclude filters defined for this object?\
+ // The objTupe is the type of the objects to query the data for
+ if($isMemberQuery && $OBJS[0]->hasExcludeFilters($isCountQuery)) {
+ $filter = $OBJS[0]->getExcludeFilter($isCountQuery);
+ $objType = $OBJS[0]->getType();
+
+ if($objType == 'host') {
+ $parts = explode('~~', $filter);
+ if(!isset($parts[1]))
+ $objFilters[] = " ".$childTable.".name2 NOT REGEXP BINARY \"".$filter."\"";
+
+ } elseif($objType == 'hostgroup' && $isHostQuery) {
+ $parts = explode('~~', $filter);
+ if(!isset($parts[1]))
+ $objFilters[] = " ".$childTable.".name1 NOT REGEXP BINARY \"".$parts[0]."\"";
+
+ } elseif(($objType == 'hostgroup' && !$isHostQuery) || $objType == 'servicegroup') {
+ $parts = explode('~~', $filter);
+ if(isset($parts[1]))
+ $objFilters[] = " NOT (".$childTable.".name1 REGEXP BINARY \"".$parts[0]."\" "
+ ." AND ".$childTable.".name2 REGEXP BINARY \"".$parts[1]."\")";
+ else
+ $objFilters[] = " ".$childTable.".name1 NOT REGEXP BINARY \"".$parts[0]."\"";
+ }
+ }
+
+ $aFilters[] = implode(' AND ', $objFilters);
+ }
+
+ return implode(' OR ', $aFilters);
+ }
+
+
+ /**
+ * PRIVATE Method getHostAckByHostname
+ *
+ * Returns if a host state has been acknowledged. The method doesn't check
+ * if the host is in OK/DOWN, it only checks the has_been_acknowledged flag.
+ *
+ * @param string $hostName
+ * @return bool $ack
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ private function getHostAckByHostname($hostName) {
+ $return = 0;
+
+ // Read from cache or fetch from NDO
+ if(isset($this->hostAckCache[$hostName])) {
+ $return = $this->hostAckCache[$hostName];
+ } else {
+ $QUERYHANDLE = $this->mysqlQuery('SELECT problem_has_been_acknowledged
+ FROM '.$this->dbPrefix.'objects AS o,'.$this->dbPrefix.'hoststatus AS h
+ WHERE (o.objecttype_id=1 AND o.name1 = binary \''.$hostName.'\' AND o.instance_id='.$this->dbInstanceId.') AND h.host_object_id=o.object_id LIMIT 1');
+
+ $data = mysql_fetch_assoc($QUERYHANDLE);
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ // It's unnessecary to check if the value is 0, everything not equal to 1 is FALSE
+ if(isset($data['problem_has_been_acknowledged']) && $data['problem_has_been_acknowledged'] == '1') {
+ $return = 1;
+ } else {
+ $return = 0;
+ }
+
+ // Save to cache
+ $this->hostAckCache[$hostName] = $return;
+ }
+
+ return $return;
+ }
+
+ /**
+ * PUBLIC getHostState()
+ *
+ * Returns the Nagios state and additional information for the requested host
+ *
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getHostState($objects, $options, $filters, $isMemberQuery = false) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.object_id, alias, display_name, address, o.name1,
+ has_been_checked,
+ last_hard_state,
+ UNIX_TIMESTAMP(last_hard_state_change) AS last_hard_state_change,
+ UNIX_TIMESTAMP(last_state_change) AS last_state_change,
+ current_state,
+ output, perfdata,
+ h.notes,
+ problem_has_been_acknowledged,
+ UNIX_TIMESTAMP(last_check) AS last_check, UNIX_TIMESTAMP(next_check) AS next_check,
+ hs.state_type, hs.current_check_attempt, hs.max_check_attempts, hs.check_command,
+ UNIX_TIMESTAMP(dh.scheduled_start_time) AS downtime_start, UNIX_TIMESTAMP(dh.scheduled_end_time) AS downtime_end,
+ dh.author_name AS downtime_author, dh.comment_data AS downtime_data
+ FROM
+ '.$this->dbPrefix.'hosts AS h,
+ '.$this->dbPrefix.'objects AS o
+ LEFT JOIN
+ '.$this->dbPrefix.'hoststatus AS hs
+ ON hs.host_object_id=o.object_id
+ LEFT JOIN
+ '.$this->dbPrefix.'scheduleddowntime AS dh
+ ON dh.object_id=o.object_id AND NOW()>dh.scheduled_start_time AND NOW()<dh.scheduled_end_time
+ WHERE
+ (o.objecttype_id=1 AND ('.$this->parseFilter($objects, $filters, 'o', 'o', $isMemberQuery, false, HOST_QUERY).')
+ AND o.instance_id='.$this->dbInstanceId.')
+ AND (h.config_type='.$this->objConfigType.' AND h.instance_id='.$this->dbInstanceId.' AND h.host_object_id=o.object_id)');
+
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+
+ // If there is a downtime for this object, save the data
+ $in_downtime = 0;
+ $dt_details = array(null, null, null, null);
+ if(isset($data['downtime_start']) && $data['downtime_start'] != '') {
+ $in_downtime = 1;
+ $dt_details = array($data['downtime_author'], $data['downtime_data'],
+ $data['downtime_start'], $data['downtime_end']);
+ }
+
+ /**
+ * Only recognize hard states. There was a discussion about the implementation
+ * This is a new handling of only_hard_states. For more details, see:
+ * http://www.nagios-portal.de/wbb/index.php?page=Thread&threadID=8524
+ *
+ * Thanks to Andurin and fredy82
+ */
+ if($options & 1)
+ if($data['state_type'] != '0')
+ $data['current_state'] = $data['current_state'];
+ else
+ $data['current_state'] = $data['last_hard_state'];
+
+ $acknowledged = 0;
+
+ if($data['has_been_checked'] == '0' || $data['current_state'] == '') {
+ $state = UNCHECKED;
+ $output = l('hostIsPending', Array('HOST' => $data['name1']));
+ } elseif($data['current_state'] == '0') {
+ // Host is UP
+ $state = UP;
+ $output = $data['output'];
+ } else {
+ // Host is DOWN/UNREACHABLE/UNKNOWN
+
+ $acknowledged = intval($data['problem_has_been_acknowledged']);
+
+ // Store state and output in array
+ switch($data['current_state']) {
+ case '1':
+ $state = DOWN;
+ $output = $data['output'];
+ break;
+ case '2':
+ $state = UNREACHABLE;
+ $output = $data['output'];
+ break;
+ case '3':
+ $state = UNKNOWN;
+ $output = $data['output'];
+ break;
+ default:
+ $state = UNKNOWN;
+ $output = 'GlobalBackendndomy::getHostState: Undefined state!';
+ break;
+ }
+ }
+
+ $arrReturn[$data['name1']] = array(
+ $state,
+ $output,
+ $acknowledged,
+ $in_downtime,
+ 0, // staleness
+ $data['state_type'],
+ $data['current_check_attempt'],
+ $data['max_check_attempts'],
+ $data['last_check'],
+ $data['next_check'],
+ $data['last_hard_state_change'],
+ $data['last_state_change'],
+ $data['perfdata'],
+ $data['display_name'],
+ $data['alias'],
+ $data['address'],
+ $data['notes'],
+ $data['check_command'],
+ null, // custom_vars
+ $dt_details[0], // downtime author
+ $dt_details[1], // downtime comment
+ $dt_details[2], // downtime start
+ $dt_details[3], // downtime end
+ );
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC getServiceState()
+ *
+ * Returns the state and additional information of the requested service
+ *
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getServiceState($objects, $options, $filters, $isMemberQuery = false) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.object_id, o.name1, o.name2,
+ s.display_name,
+ s.notes,
+ h.address,
+ ss.has_been_checked, ss.last_hard_state, ss.current_state,
+ UNIX_TIMESTAMP(ss.last_hard_state_change) AS last_hard_state_change,
+ UNIX_TIMESTAMP(ss.last_state_change) AS last_state_change,
+ ss.output, ss.perfdata, ss.problem_has_been_acknowledged,
+ UNIX_TIMESTAMP(ss.last_check) AS last_check, UNIX_TIMESTAMP(ss.next_check) AS next_check,
+ ss.state_type, ss.current_check_attempt, ss.max_check_attempts, ss.check_command,
+ UNIX_TIMESTAMP(dh.scheduled_start_time) AS downtime_start, UNIX_TIMESTAMP(dh.scheduled_end_time) AS downtime_end,
+ dh.author_name AS downtime_author, dh.comment_data AS downtime_data
+ FROM
+ '.$this->dbPrefix.'services AS s,
+ '.$this->dbPrefix.'hosts AS h,
+ '.$this->dbPrefix.'objects AS o
+ LEFT JOIN
+ '.$this->dbPrefix.'servicestatus AS ss
+ ON ss.service_object_id=o.object_id
+ LEFT JOIN
+ '.$this->dbPrefix.'scheduleddowntime AS dh
+ ON dh.object_id=o.object_id AND NOW()>dh.scheduled_start_time AND NOW()<dh.scheduled_end_time
+ WHERE
+ (o.objecttype_id=2 AND ('.$this->parseFilter($objects, $filters, 'o', 'o', $isMemberQuery, false, !HOST_QUERY).'))
+ AND (s.config_type='.$this->objConfigType.' AND s.instance_id='.$this->dbInstanceId.' AND s.service_object_id=o.object_id)
+ AND (h.config_type='.$this->objConfigType.' AND h.instance_id='.$this->dbInstanceId.' AND h.host_object_id=s.host_object_id)
+ ');
+
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+ $arrTmpReturn = Array();
+
+ if(isset($objects[$data['name1'].'~~'.$data['name2']])) {
+ $specific = true;
+ $key = $data['name1'].'~~'.$data['name2'];
+ } else {
+ $specific = false;
+ $key = $data['name1'];
+ }
+
+ // If there is a downtime for this object, save the data
+ $in_downtime = 0;
+ $dt_details = array(null, null, null, null);
+ if(isset($data['downtime_start']) && $data['downtime_start'] != '') {
+ $in_downtime = 1;
+ $dt_details = array($data['downtime_author'], $data['downtime_data'],
+ $data['downtime_start'], $data['downtime_end']);
+ }
+
+ /**
+ * Only recognize hard states. There was a discussion about the implementation
+ * This is a new handling of only_hard_states. For more details, see:
+ * http://www.nagios-portal.de/wbb/index.php?page=Thread&threadID=8524
+ *
+ * Thanks to Andurin and fredy82
+ */
+ if($options & 1)
+ if($data['state_type'] != '0')
+ $data['current_state'] = $data['current_state'];
+ else
+ $data['current_state'] = $data['last_hard_state'];
+
+ $acknowledged = 0;
+ if($data['has_been_checked'] == '0' || $data['current_state'] == '') {
+ $state = PENDING;
+ $output = l('serviceNotChecked', Array('SERVICE' => $data['name2']));
+ } elseif($data['current_state'] == '0') {
+ // Host is UP
+ $state = OK;
+ $output = $data['output'];
+ } else {
+ // Host is DOWN/UNREACHABLE/UNKNOWN
+
+ /**
+ * If state is not OK (=> WARN, CRIT, UNKNOWN) and service is not
+ * acknowledged => check for acknowledged host
+ */
+ if($data['problem_has_been_acknowledged'] != 1) {
+ $acknowledged = $this->getHostAckByHostname($data['name1']);
+ } else {
+ $acknowledged = intval($data['problem_has_been_acknowledged']);
+ }
+
+ // Store state and output in array
+ switch($data['current_state']) {
+ case '1':
+ $state = WARNING;
+ $output = $data['output'];
+ break;
+ case '2':
+ $state = CRITICAL;
+ $output = $data['output'];
+ break;
+ case '3':
+ $state = UNKNOWN;
+ $output = $data['output'];
+ break;
+ default:
+ $state = UNKNOWN;
+ $output = 'GlobalBackendndomy::getServiceState: Undefined state!';
+ break;
+ }
+ }
+
+ $svc = array(
+ $state,
+ $output,
+ $acknowledged,
+ $in_downtime,
+ 0, // staleness
+ $data['state_type'],
+ $data['current_check_attempt'],
+ $data['max_check_attempts'],
+ $data['last_check'],
+ $data['next_check'],
+ $data['last_hard_state_change'],
+ $data['last_state_change'],
+ $data['perfdata'],
+ $data['display_name'],
+ $data['display_name'],
+ $data['address'],
+ $data['notes'],
+ $data['check_command'],
+ null, //custom_vars
+ $dt_details[0], // dt author
+ $dt_details[1], // dt data
+ $dt_details[2], // dt start
+ $dt_details[3], // dt end
+ $data['name2']
+ );
+
+ if($specific) {
+ $arrReturn[$key] = $svc;
+ } else {
+ if(!isset($arrReturn[$key]))
+ $arrReturn[$key] = Array();
+
+ $arrReturn[$key][] = $svc;
+ }
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC getHostMemberCounts()
+ *
+ * @param Array List of objects to query
+ * @param Array List of filters to apply
+ * @return Array List of states and counts
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getHostMemberCounts($objects, $options, $filters) {
+ if($options & 1)
+ $stateAttr = 'IF((ss.state_type = 0), ss.last_hard_state, ss.current_state)';
+ else
+ $stateAttr = 'ss.current_state';
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.name1, h.alias,
+ SUM(IF(ss.has_been_checked=0,1,0)) AS pending,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND hs.scheduled_downtime_depth=0),1,0)) AS ok,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND (ss.scheduled_downtime_depth!=0 OR hs.scheduled_downtime_depth!=0)),1,0)) AS ok_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND hs.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0 AND hs.problem_has_been_acknowledged=0),1,0)) AS warning,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND (ss.scheduled_downtime_depth!=0 OR hs.scheduled_downtime_depth!=0)),1,0)) AS warning_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND (ss.problem_has_been_acknowledged=1 OR hs.problem_has_been_acknowledged=1)),1,0)) AS warning_ack,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND hs.scheduled_downtime_depth=0) AND ss.problem_has_been_acknowledged=0 AND hs.problem_has_been_acknowledged=0,1,0)) AS critical,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND (ss.scheduled_downtime_depth!=0 OR hs.scheduled_downtime_depth!=0)),1,0)) AS critical_downtime,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND (ss.problem_has_been_acknowledged=1 OR hs.problem_has_been_acknowledged=1)),1,0)) AS critical_ack,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND hs.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0 AND hs.problem_has_been_acknowledged=0),1,0)) AS unknown,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND (ss.scheduled_downtime_depth!=0 OR hs.scheduled_downtime_depth!=0)),1,0)) AS unknown_downtime,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND (ss.problem_has_been_acknowledged=1 OR hs.problem_has_been_acknowledged=1)),1,0)) AS unknown_ack
+ FROM
+ '.$this->dbPrefix.'hoststatus AS hs,
+ '.$this->dbPrefix.'services AS s,
+ '.$this->dbPrefix.'hosts AS h,
+ '.$this->dbPrefix.'objects AS o
+ LEFT JOIN
+ '.$this->dbPrefix.'servicestatus AS ss
+ ON ss.service_object_id=o.object_id
+ WHERE
+ (o.objecttype_id=2 AND ('.$this->parseFilter($objects, $filters, 'o', 'o', MEMBER_QUERY, COUNT_QUERY, !HOST_QUERY).'))
+ AND (s.config_type='.$this->objConfigType.' AND s.instance_id='.$this->dbInstanceId.' AND s.service_object_id=o.object_id)
+ AND (h.config_type='.$this->objConfigType.' AND h.instance_id='.$this->dbInstanceId.' AND h.host_object_id=s.host_object_id)
+ AND (hs.host_object_id=h.host_object_id)
+ GROUP BY h.host_object_id');
+
+ $arrReturn = Array();
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+ $arrReturn[$data['name1']] = Array(
+ //'details' => Array('alias' => $data['alias']),
+ 'counts' => Array(
+ PENDING => Array(
+ 'normal' => intval($data['pending']),
+ ),
+ OK => Array(
+ 'normal' => intval($data['ok']),
+ 'stale' => 0,
+ 'downtime' => intval($data['ok_downtime']),
+ ),
+ WARNING => Array(
+ 'normal' => intval($data['warning']),
+ 'stale' => 0,
+ 'ack' => intval($data['warning_ack']),
+ 'downtime' => intval($data['warning_downtime']),
+ ),
+ CRITICAL => Array(
+ 'normal' => intval($data['critical']),
+ 'stale' => 0,
+ 'ack' => intval($data['critical_ack']),
+ 'downtime' => intval($data['critical_downtime']),
+ ),
+ UNKNOWN => Array(
+ 'normal' => intval($data['unknown']),
+ 'stale' => 0,
+ 'ack' => intval($data['unknown_ack']),
+ 'downtime' => intval($data['unknown_downtime']),
+ ),
+ )
+ );
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ public function getHostgroupStateCounts($objects, $options, $filters) {
+ if($options & 1)
+ $stateAttr = 'IF((hs.state_type = 0), hs.last_hard_state, hs.current_state)';
+ else
+ $stateAttr = 'hs.current_state';
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.name1, hg.alias,
+ SUM(IF(hs.has_been_checked=0,1,0)) AS unchecked,
+ SUM(IF(('.$stateAttr.'=0 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth=0),1,0)) AS up,
+ SUM(IF(('.$stateAttr.'=0 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth!=0),1,0)) AS up_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth=0 AND hs.problem_has_been_acknowledged=0),1,0)) AS down,
+ SUM(IF(('.$stateAttr.'=1 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth!=0),1,0)) AS down_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND hs.has_been_checked!=0 AND hs.problem_has_been_acknowledged=1),1,0)) AS down_ack,
+ SUM(IF(('.$stateAttr.'=2 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth=0 AND hs.problem_has_been_acknowledged=0),1,0)) AS unreachable,
+ SUM(IF(('.$stateAttr.'=2 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth!=0),1,0)) AS unreachable_downtime,
+ SUM(IF(('.$stateAttr.'=2 AND hs.has_been_checked!=0 AND hs.problem_has_been_acknowledged=1),1,0)) AS unreachable_ack,
+ SUM(IF(('.$stateAttr.'=3 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth=0 AND hs.problem_has_been_acknowledged=0),1,0)) AS unknown,
+ SUM(IF(('.$stateAttr.'=3 AND hs.has_been_checked!=0 AND hs.scheduled_downtime_depth!=0),1,0)) AS unknown_downtime,
+ SUM(IF(('.$stateAttr.'=3 AND hs.has_been_checked!=0 AND hs.problem_has_been_acknowledged=1),1,0)) AS unknown_ack
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'hostgroups AS hg,
+ '.$this->dbPrefix.'hostgroup_members AS hgm,
+ '.$this->dbPrefix.'objects AS o2
+ LEFT JOIN
+ '.$this->dbPrefix.'hoststatus AS hs
+ ON hs.host_object_id=o2.object_id
+ WHERE
+ (o.objecttype_id=3 AND ('.$this->parseFilter($objects, $filters, 'o', 'o2', MEMBER_QUERY, COUNT_QUERY, HOST_QUERY).')
+ AND o.instance_id='.$this->dbInstanceId.')
+ AND (hg.config_type='.$this->objConfigType.' AND hg.instance_id='.$this->dbInstanceId.' AND hg.hostgroup_object_id=o.object_id)
+ AND hgm.hostgroup_id=hg.hostgroup_id
+ AND (o2.objecttype_id=1 AND o2.object_id=hgm.host_object_id)
+ GROUP BY o.object_id');
+
+ $arrReturn = Array();
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+ $arrReturn[$data['name1']] = Array(
+ 'details' => Array(ALIAS => $data['alias']),
+ 'counts' => Array(
+ UNCHECKED => Array(
+ 'normal' => intval($data['unchecked']),
+ ),
+ UP => Array(
+ 'normal' => intval($data['up']),
+ 'stale' => 0,
+ 'downtime' => intval($data['up_downtime']),
+ ),
+ DOWN => Array(
+ 'normal' => intval($data['down']),
+ 'stale' => 0,
+ 'ack' => intval($data['down_ack']),
+ 'downtime' => intval($data['down_downtime']),
+ ),
+ UNREACHABLE => Array(
+ 'normal' => intval($data['unreachable']),
+ 'stale' => 0,
+ 'ack' => intval($data['unreachable_ack']),
+ 'downtime' => intval($data['unreachable_downtime']),
+ ),
+ ),
+ );
+ }
+
+ if($options & 1)
+ $stateAttr = 'IF((ss.state_type = 0), ss.last_hard_state, ss.current_state)';
+ else
+ $stateAttr = 'ss.current_state';
+
+ // If recognize_services are disabled don't fetch service information
+ if($options & 2)
+ return $arrReturn;
+
+ // FIXME: Does not handle host downtimes/acks
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.name1,
+ SUM(IF(ss.has_been_checked=0,1,0)) AS pending,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0),1,0)) AS ok,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS ok_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS warning,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS warning_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS warning_ack,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS critical,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS critical_downtime,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS critical_ack,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS unknown,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS unknown_downtime,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS unknown_ack
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'hostgroups AS hg,
+ '.$this->dbPrefix.'hostgroup_members AS hgm,
+ '.$this->dbPrefix.'services AS s,
+ '.$this->dbPrefix.'objects AS o2
+ LEFT JOIN
+ '.$this->dbPrefix.'servicestatus AS ss
+ ON ss.service_object_id=o2.object_id
+ WHERE
+ (o.objecttype_id=3 AND ('.$this->parseFilter($objects, $filters, 'o', 'o2', MEMBER_QUERY, COUNT_QUERY, !HOST_QUERY).')
+ AND o.instance_id='.$this->dbInstanceId.')
+ AND (hg.config_type='.$this->objConfigType.' AND hg.instance_id='.$this->dbInstanceId.' AND hg.hostgroup_object_id=o.object_id)
+ AND hgm.hostgroup_id=hg.hostgroup_id
+ AND (s.config_type='.$this->objConfigType.' AND s.instance_id='.$this->dbInstanceId.' AND s.host_object_id=hgm.host_object_id)
+ AND (o2.objecttype_id=2 AND s.service_object_id=o2.object_id)
+ GROUP BY o.object_id');
+
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+ $arrReturn[$data['name1']]['counts'][PENDING]['normal'] = intval($data['pending']);
+ $arrReturn[$data['name1']]['counts'][OK]['normal'] = intval($data['ok']);
+ $arrReturn[$data['name1']]['counts'][OK]['stale'] = 0;
+ $arrReturn[$data['name1']]['counts'][OK]['downtime'] = intval($data['ok_downtime']);
+ $arrReturn[$data['name1']]['counts'][WARNING]['normal'] = intval($data['warning']);
+ $arrReturn[$data['name1']]['counts'][WARNING]['stale'] = 0;
+ $arrReturn[$data['name1']]['counts'][WARNING]['ack'] = intval($data['warning_ack']);
+ $arrReturn[$data['name1']]['counts'][WARNING]['downtime'] = intval($data['warning_downtime']);
+ $arrReturn[$data['name1']]['counts'][CRITICAL]['normal'] = intval($data['critical']);
+ $arrReturn[$data['name1']]['counts'][CRITICAL]['stale'] = 0;
+ $arrReturn[$data['name1']]['counts'][CRITICAL]['ack'] = intval($data['critical_ack']);
+ $arrReturn[$data['name1']]['counts'][CRITICAL]['downtime'] = intval($data['critical_downtime']);
+ $arrReturn[$data['name1']]['counts'][UNKNOWN]['normal'] = intval($data['unknown']);
+ $arrReturn[$data['name1']]['counts'][UNKNOWN]['stale'] = 0;
+ $arrReturn[$data['name1']]['counts'][UNKNOWN]['ack'] = intval($data['unknown_ack']);
+ $arrReturn[$data['name1']]['counts'][UNKNOWN]['downtime'] = intval($data['unknown_downtime']);
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ public function getServicegroupStateCounts($objects, $options, $filters) {
+ if($options & 1)
+ $stateAttr = 'IF((ss.state_type = 0), ss.last_hard_state, ss.current_state)';
+ else
+ $stateAttr = 'ss.current_state';
+
+ // FIXME: Recognize host ack/downtime
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.name1, sg.alias,
+ SUM(IF(ss.has_been_checked=0,1,0)) AS pending,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.scheduled_downtime_depth=0),1,0)) AS ok,
+ SUM(IF(('.$stateAttr.'=0 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS ok_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS warning,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS warning_downtime,
+ SUM(IF(('.$stateAttr.'=1 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS warning_ack,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS critical,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS critical_downtime,
+ SUM(IF(('.$stateAttr.'=2 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS critical_ack,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth=0 AND ss.problem_has_been_acknowledged=0),1,0)) AS unknown,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.scheduled_downtime_depth!=0),1,0)) AS unknown_downtime,
+ SUM(IF(('.$stateAttr.'=3 AND ss.has_been_checked!=0 AND ss.problem_has_been_acknowledged=1),1,0)) AS unknown_ack
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'servicegroups AS sg,
+ '.$this->dbPrefix.'servicegroup_members AS sgm,
+ '.$this->dbPrefix.'services AS s,
+ '.$this->dbPrefix.'objects AS o2
+ LEFT JOIN
+ '.$this->dbPrefix.'servicestatus AS ss
+ ON ss.service_object_id=o2.object_id
+ WHERE
+ (o.objecttype_id=4 AND ('.$this->parseFilter($objects, $filters, 'o', 'o2', MEMBER_QUERY, COUNT_QUERY, !HOST_QUERY).')
+ AND o.instance_id='.$this->dbInstanceId.')
+ AND (sg.config_type='.$this->objConfigType.' AND sg.instance_id='.$this->dbInstanceId.' AND sg.servicegroup_object_id=o.object_id)
+ AND sgm.servicegroup_id=sg.servicegroup_id
+ AND (s.config_type='.$this->objConfigType.' AND s.instance_id='.$this->dbInstanceId.' AND s.service_object_id=sgm.service_object_id)
+ AND (o2.objecttype_id=2 AND s.service_object_id=o2.object_id)
+ GROUP BY o.object_id');
+
+ $arrReturn = Array();
+ while($data = mysql_fetch_assoc($QUERYHANDLE)) {
+ $arrReturn[$data['name1']] = Array(
+ 'details' => Array(ALIAS => $data['alias']),
+ 'counts' => Array(
+ PENDING => Array(
+ 'normal' => intval($data['pending']),
+ ),
+ OK => Array(
+ 'normal' => intval($data['ok']),
+ 'stale' => 0,
+ 'downtime' => intval($data['ok_downtime']),
+ ),
+ WARNING => Array(
+ 'normal' => intval($data['warning']),
+ 'stale' => 0,
+ 'ack' => intval($data['warning_ack']),
+ 'downtime' => intval($data['warning_downtime']),
+ ),
+ CRITICAL => Array(
+ 'normal' => intval($data['critical']),
+ 'stale' => 0,
+ 'ack' => intval($data['critical_ack']),
+ 'downtime' => intval($data['critical_downtime']),
+ ),
+ UNKNOWN => Array(
+ 'normal' => intval($data['unknown']),
+ 'stale' => 0,
+ 'ack' => intval($data['unknown_ack']),
+ 'downtime' => intval($data['unknown_downtime']),
+ ),
+ ),
+ );
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC Method getHostNamesWithNoParent
+ *
+ * Gets all hosts with no parent host. This method is needed by the automap
+ * to get the root host.
+ *
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getHostNamesWithNoParent() {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT o1.name1
+ FROM
+ `'.$this->dbPrefix.'objects` AS o1,
+ `'.$this->dbPrefix.'hosts` AS h1
+ LEFT OUTER JOIN `'.$this->dbPrefix.'host_parenthosts` AS ph1 ON h1.host_id=ph1.host_id
+ WHERE o1.objecttype_id=1
+ AND (h1.config_type='.$this->objConfigType.' AND h1.instance_id='.$this->dbInstanceId.' AND h1.host_object_id=o1.object_id)
+ AND ph1.parent_host_object_id IS null');
+
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ $arrReturn[] = $data['name1'];
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC getDirectParentNamesByHostName()
+ *
+ * Gets the names of all parent hosts. New in 1.5. Showing parent layers on
+ * the automap is only possible when the backend provides this method.
+ *
+ * @param String Name of host to get the parents of
+ * @return Array Array with hostnames
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getDirectParentNamesByHostName($hostName) {
+ $aParentNames = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT o2.name1
+ FROM
+ `'.$this->dbPrefix.'objects` AS o1,
+ `'.$this->dbPrefix.'hosts` AS h1,
+ `'.$this->dbPrefix.'host_parenthosts` AS ph1,
+ `'.$this->dbPrefix.'objects` AS o2
+ WHERE o1.objecttype_id=1 AND o1.name1=\''.$hostName.'\'
+ AND (h1.config_type='.$this->objConfigType.' AND h1.instance_id='.$this->dbInstanceId.' AND h1.host_object_id=o1.object_id)
+ AND h1.host_id=ph1.host_id
+ AND o2.objecttype_id=1 AND o2.object_id=ph1.parent_host_object_id');
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ $aParentNames[] = $data['name1'];
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $aParentNames;
+ }
+
+ /**
+ * PUBLIC Method getDirectChildNamesByHostName
+ *
+ * Gets the names of all child hosts
+ *
+ * @param String Name of host to get the children of
+ * @return Array Array with hostnames
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getDirectChildNamesByHostName($hostName) {
+ $arrChildNames = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT o2.name1
+ FROM
+ `'.$this->dbPrefix.'objects` AS o1,
+ `'.$this->dbPrefix.'hosts` AS h1,
+ `'.$this->dbPrefix.'host_parenthosts` AS ph1,
+ `'.$this->dbPrefix.'hosts` AS h2,
+ `'.$this->dbPrefix.'objects` AS o2
+ WHERE o1.objecttype_id=1 AND o1.name1=\''.$hostName.'\'
+ AND (h1.config_type='.$this->objConfigType.' AND h1.instance_id='.$this->dbInstanceId.' AND h1.host_object_id=o1.object_id)
+ AND o1.object_id=ph1.parent_host_object_id
+ AND (h2.config_type='.$this->objConfigType.' AND h2.instance_id='.$this->dbInstanceId.' AND h2.host_id=ph1.host_id)
+ AND o2.objecttype_id=1 AND h2.host_object_id=o2.object_id');
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ $arrChildNames[] = $data['name1'];
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrChildNames;
+ }
+
+ /**
+ * PUBLIC Method getHostsByHostgroupName
+ *
+ * Gets all hosts of a hostgroup
+ *
+ * @param String Name of hostgroup to get the hosts of
+ * @return Array Array with hostnames
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getHostsByHostgroupName($hostgroupName) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o2.name1
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'hostgroups AS hg,
+ '.$this->dbPrefix.'hostgroup_members AS hgm,
+ '.$this->dbPrefix.'objects AS o2
+ WHERE
+ (o.objecttype_id=3 AND o.name1 = binary \''.$hostgroupName.'\' AND o.instance_id='.$this->dbInstanceId.')
+ AND (hg.config_type='.$this->objConfigType.' AND hg.instance_id='.$this->dbInstanceId.' AND hg.hostgroup_object_id=o.object_id)
+ AND hgm.hostgroup_id=hg.hostgroup_id
+ AND (o2.objecttype_id=1 AND o2.object_id=hgm.host_object_id)');
+
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ // Assign actual dataset to return array
+ $arrReturn[] = $data['name1'];
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC Method getServicesByServicegroupName
+ *
+ * Gets all services of a servicegroup
+ *
+ * @param String Name of servicegroup to get the services of
+ * @return Array Array with hostnames and service descriptions
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getServicesByServicegroupName($servicegroupName) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o2.name1, o2.name2
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'servicegroups AS sg,
+ '.$this->dbPrefix.'servicegroup_members AS sgm,
+ '.$this->dbPrefix.'objects AS o2
+ WHERE
+ (o.objecttype_id=4 AND o.name1 = binary \''.$servicegroupName.'\' AND o.instance_id='.$this->dbInstanceId.')
+ AND (sg.config_type='.$this->objConfigType.' AND sg.instance_id='.$this->dbInstanceId.' AND sg.servicegroup_object_id=o.object_id)
+ AND sgm.servicegroup_id=sg.servicegroup_id
+ AND (o2.objecttype_id=2 AND o2.object_id=sgm.service_object_id)');
+
+ while($data = mysql_fetch_array($QUERYHANDLE)) {
+ // Assign actual dataset to return array
+ $arrReturn[] = Array('host_name' => $data['name1'], 'service_description' => $data['name2']);
+ }
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC Method getServicegroupInformations
+ *
+ * Gets information like the alias for a servicegroup
+ *
+ * @param String Name of servicegroup
+ * @return Array Array with object information
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getServicegroupInformations($servicegroupName) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.object_id, sg.alias
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'servicegroups AS sg
+ WHERE
+ (o.objecttype_id=4 AND o.name1 = binary \''.$servicegroupName.'\' AND o.instance_id='.$this->dbInstanceId.')
+ AND (sg.config_type='.$this->objConfigType.' AND sg.instance_id='.$this->dbInstanceId.' AND sg.servicegroup_object_id=o.object_id)
+ LIMIT 1');
+
+ $data = mysql_fetch_array($QUERYHANDLE);
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ $arrReturn['alias'] = $data['alias'];
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC Method getHostgroupInformations
+ *
+ * Gets information like the alias for a hostgroup
+ *
+ * @param String Name of group
+ * @return Array Array with object information
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getHostgroupInformations($groupName) {
+ $arrReturn = Array();
+
+ $QUERYHANDLE = $this->mysqlQuery('SELECT
+ o.object_id, g.alias
+ FROM
+ '.$this->dbPrefix.'objects AS o,
+ '.$this->dbPrefix.'hostgroups AS g
+ WHERE
+ (o.objecttype_id=3 AND o.name1 = binary \''.$groupName.'\' AND o.instance_id='.$this->dbInstanceId.')
+ AND (g.config_type='.$this->objConfigType.' AND g.instance_id='.$this->dbInstanceId.' AND g.hostgroup_object_id=o.object_id)
+ LIMIT 1');
+
+ $data = mysql_fetch_array($QUERYHANDLE);
+
+ // Free memory
+ mysql_free_result($QUERYHANDLE);
+
+ $arrReturn['alias'] = $data['alias'];
+
+ return $arrReturn;
+ }
+
+ /**
+ * PUBLIC getDirectChildDependenciesNamesByHostName()
+ *
+ * @param String Hostname
+ * @return Array List of hostnames
+ * @author Thibault Cohen <thibault.cohen@savoirfairelinux.com>
+ */
+ public function getDirectChildDependenciesNamesByHostName($hostName, $min_business_impact=false) {
+ return $this->getDirectChildNamesByHostName($hostName);
+ }
+
+ /*
+ * PUBLIC getDirectParentNamesByHostName()
+ *
+ * @param String Hostname
+ * @return Array List of hostnames
+ * @author Mathias Kettner <mk@mathias-kettner.de>
+ * @author Lars Michelsen <lars@vertical-visions.de>
+ */
+ public function getDirectParentDependenciesNamesByHostName($hostName, $min_business_impact=false) {
+ return $this->getDirectParentNamesByHostName($hostName);
+ }
+
+ public function getProgramStart() {
+ $QUERYHANDLE = $this->mysqlQuery('SELECT UNIX_TIMESTAMP(program_start_time) AS program_start '
+ .'FROM '.$this->dbPrefix.'programstatus WHERE instance_id='.$this->dbInstanceId);
+ $data = mysql_fetch_array($QUERYHANDLE);
+ mysql_free_result($QUERYHANDLE);
+ if(isset($data[0]))
+ return $data[0];
+ else
+ return -1;
+ }
+
+
+}
+?>
diff --git a/library/nagvis-includes/TODO.md b/library/nagvis-includes/TODO.md
new file mode 100644
index 0000000..ea17bcc
--- /dev/null
+++ b/library/nagvis-includes/TODO.md
@@ -0,0 +1 @@
+GlobalBackendicingaweb2.php
diff --git a/library/nagvis-includes/init.inc.php b/library/nagvis-includes/init.inc.php
new file mode 100644
index 0000000..6eb4d46
--- /dev/null
+++ b/library/nagvis-includes/init.inc.php
@@ -0,0 +1,3 @@
+<?php
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());