arrSettings = $arrSession['SETS'];
}
if (isset($arrSession['domain'])) {
$this->intDomainId = (int)$arrSession['domain'];
}
$this->arrSession = $arrSession;
}
/**
* Find out the actual position inside the menu tree and returns it as an info line
* @param int $intPageId Current content id
* @param string $strTop Label string for the root node
* @return string HTML info string
*/
public function getPosition(int $intPageId, string $strTop = ''): string
{
/* Define variables */
$arrData = array();
$intDataCount = 0;
$strPosition = '';
/* Read database values */
$strSQL = 'SELECT B.`mnuName` AS `mainitem`, B.`mnuLink` AS `mainlink`, A.`mnuName` AS `subitem`, '
. 'A.`mnuLink` AS `sublink` FROM `tbl_menu` AS A '
. 'LEFT JOIN `tbl_menu` AS B ON A.`mnuTopId` = B.`mnuId` WHERE A.`mnuId`=' . $intPageId;
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
} elseif ($intDataCount !== 0) {
$strMainLink = $this->arrSettings['path']['base_url'] . $arrData[0]['mainlink'];
$strMain = $arrData[0]['mainitem'];
$strSubLink = $this->arrSettings['path']['base_url'] . $arrData[0]['sublink'];
$strSub = $arrData[0]['subitem'];
if ($strTop !== '') {
$strPosition .= "" . $strTop . ' -> ';
}
if (($strMain !== '') && ($strMain !== null)) {
$strPosition .= "" . translate($strMain) . " -> " .
translate($strSub) . '';
} else {
$strPosition .= "" . translate($strSub) . '';
}
}
return $strPosition;
}
/**
* Generate the main menu HTML
* @param int $intPageId Current content id
* @param int $intCntId Menu group ID
* @return string HTML menu string
*/
public function getMenu(int $intPageId, int $intCntId = 1): string
{
/* Define variables */
$strQueryString = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_UNSAFE_RAW);
$strPHPSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_UNSAFE_RAW);
/* Modify URL for visible/invisible menu */
$strQuery = str_replace(
array('menu=visible&', 'menu=invisible&', 'menu=visible', 'menu=invisible'),
'',
$strQueryString
);
if ($strQuery !== '') {
$strVisible = str_replace('&', '&', $strPHPSelf . '?menu=visible&' . $strQuery);
$strInvisible = str_replace('&', '&', $strPHPSelf . '?menu=invisible&' . $strQuery);
} else {
$strVisible = $strPHPSelf . '?menu=visible';
$strInvisible = $strPHPSelf . '?menu=invisible';
}
$this->intPageId = $intPageId;
if (!isset($this->arrSession['menu']) || ($this->arrSession['menu'] !== 'invisible')) {
/* Menu visible */
$strHTML = '
' . "\n";
$strHTML .= '' . "\n";
$strHTML .= ' ' . "\n";
$strHTML .= '';
} else {
/* Menu invisible */
$strHTML = ' | ' . "\n";
$strHTML .= ' ' . "\n";
}
$strHTML .= ' | ' . "\n";
return $strHTML;
}
/**
* Recursive function to build the main menu
* @param int $intTopId ID of top menu point
* @param string $strCSS CSS class
* @param int $intCntId Menu group ID
* @param string $strMenuHTML HTML menu string (by Reference)
* @return bool
*/
private function hasMenuRecursive(int $intTopId, string $strCSS, int $intCntId, string &$strMenuHTML): bool
{
/* Define variables */
$intLevel = substr_count($strCSS, '_sub') + 1;
$booReturn = false;
$arrData = array();
/* Define SQL */
$strSQL = 'SELECT mnuId, mnuName, mnuTopId, mnuLink FROM tbl_menu ' .
"WHERE mnuTopId=$intTopId AND mnuCntId=$intCntId AND mnuActive <> 0 AND " .
'mnuGrpId IN (' . $this->getAccessGroups('read') . ') ORDER BY mnuOrderId';
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if (($booRet !== false) && ($intDataCount !== 0)) {
$strTemp = '';
/* Menu items */
foreach ($arrData as $elem) {
$strName = translate($elem['mnuName']);
$strLink = $this->arrSettings['path']['base_url'] . $elem['mnuLink'];
$intMenuId = (int)$elem['mnuId'];
$strTemp .= ' ' . "\n";
if (($intMenuId === $this->intPageId) || ($this->isMenuActive($intMenuId) === true)) {
$strTemp .= ' ';
$strTemp .= '' . $strName . ' | ' . "\n";
$booReturn = true;
} else {
$strTemp .= ' ';
$strTemp .= '' . $strName . ' | ' . "\n";
}
$strTemp .= '
' . "\n";
/* Recursive call to get submenu items */
if ((($intMenuId === $this->intPageId) || ($this->isMenuActive($intMenuId) === true)) &&
$this->hasMenuRecursive($intMenuId, $strCSS . '_sub', $intCntId, $strTemp) === true) {
$booReturn = true;
}
if ($intTopId === $this->intPageId) {
$booReturn = true;
}
}
if ($booReturn === true) {
$strMenuHTML .= $strTemp;
} elseif ($intLevel === 1) {
$strMenuHTML .= $strTemp;
}
} else {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
return $booReturn;
}
/**
* Returns any group ID with the requested access type
* @param string $strType Access type (read,write,link)
* @return string Comma separated string with group id's
*/
public function getAccessGroups(string $strType): string
{
$strReturn = '0,';
$arrData = array();
/* Admin has rights for all groups */
if ((int)$this->arrSession['userid'] === 1) {
$strSQL = 'SELECT `id` FROM `tbl_group`';
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
} elseif ($intCount !== 0) {
foreach ($arrData as $elem) {
$strReturn .= $elem['id'] . ',';
}
}
} else {
$strTypeValue = $this->getGroupValue($strType);
$strSQL = 'SELECT `idMaster` FROM `tbl_lnkGroupToUser` ' .
'WHERE `idSlave`=' . $this->arrSession['userid'] . " AND $strTypeValue";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
} elseif ($intCount !== 0) {
foreach ($arrData as $elem) {
$strReturn .= $elem['idMaster'] . ',';
}
}
}
if (substr($strReturn, -1) === ',') {
$strReturn = substr($strReturn, 0, -1);
}
return $strReturn;
}
/**
* Returns an SQL fragment based on group access type
* @param string $strType Access type (read,write,link)
* @return string SQL fragment for group selection
*/
private function getGroupValue(string $strType): string
{
/* Define variables */
$strTypeValue = '';
/* Select SQL by type */
switch ($strType) {
case 'read':
$strTypeValue = "`read`='1'";
break;
case 'write':
$strTypeValue = "`write`='1'";
break;
case 'link':
$strTypeValue = "`link`='1'";
break;
}
return $strTypeValue;
}
/**
* Check if menu point is selected
* @param int $intMenuId Menu ID
* @return bool true if active
*/
public function isMenuActive(int $intMenuId): bool
{
$booReturn = false;
$arrData = array();
$strSQL = 'SELECT mnuTopId FROM tbl_menu WHERE mnuId=' . $this->intPageId . ' AND mnuActive <> 0 ' .
'AND mnuGrpId IN (' . $this->getAccessGroups('read') . ')';
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if (($booRet !== false) && ($intDataCount !== 0)) {
foreach ($arrData as $elem) {
if ((int)$elem['mnuTopId'] === $intMenuId) {
$booReturn = true;
}
}
} else {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
return $booReturn;
}
/**
* Add security features to text values
* @param string $strKey Process string
* @return string Modified process string
*/
public function tfSecure(string $strKey): string
{
return $this->myDBClass->realEscape(stripslashes($strKey));
}
/**
* Build a string which contains links for additional pages. This is used in data lists
* with more items than defined in settings "lines per page limit"
* @param string $strSite Link to page
* @param int $intDataCount Sum of all data lines
* @param int $chkLimit Actual data limit
* @param string $strOrderBy OrderBy Field
* @param string $strOrderDir Order direction
* @return string Page site number string (HTML)
*/
public function buildPageLinks(string $strSite, int $intDataCount, int $chkLimit, string $strOrderBy = '', string $strOrderDir = ''): string
{
$intMaxLines = (int)$this->arrSettings['common']['pagelines'];
$intCount = 1;
$intCheck = 0;
$strReturn = '';
$strSiteHTML = "\n";
if ($intCount > 2) {
$strReturn = $strSiteHTML;
}
return $strReturn;
}
/**
* Builds a simple selection field inside a template
* @param string $strTable Table name (source data)
* @param string $strTabField Field name (source data)
* @param string $strTemplKey Template key
* @param int $intModeId 0=only data, 1=with empty line at the beginning, 2=with empty line and 'null' line at the beginning
* @param int $intSelId Selected data ID (from master table)
* @param int $intExclId Exclude ID
* @return int 0 = successful / 1 = error
*/
public function parseSelectSimple(
string $strTable,
string $strTabField,
string $strTemplKey,
int $intModeId = 0,
int $intSelId = -9,
int $intExclId = -9
): int
{
/* Define variables */
$intOption = 0;
$arrData = array();
$intReturn = 1;
/* Compute option value */
if (($strTemplKey === 'hostcommand') || ($strTemplKey === 'servicecommand')) {
$intOption = 1;
}
if ($strTemplKey === 'eventhandler') {
$intOption = 2;
}
if ($strTemplKey === 'service_extinfo') {
$intOption = 7;
}
/* Get version */
$this->myConfigClass->getDomainData('version', $strVersion);
$intVersion = (int)$strVersion;
/* Get raw data */
$intRaw = $this->getSelectRawdata($strTable, $strTabField, $arrData, $intOption);
if ($intRaw === 0) {
/* Insert an empty line in mode 1 */
if (($intModeId === 1) || ($intModeId === 2)) {
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), ' ');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', 0);
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
$this->myContentTpl->parse($strTemplKey);
}
/* Insert a 'null' line in mode 2 */
if ($intModeId === 2) {
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), 'null');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', -1);
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
if ($intSelId === -1) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_SEL', 'selected');
}
$this->myContentTpl->parse($strTemplKey);
}
/* Insert data sets */
foreach ($arrData as $elem) {
if ((int)$elem['key'] === $intExclId) {
continue;
}
if (isset($elem['active']) && (int)$elem['active'] === 0) {
$strActive = ' [inactive]';
$this->myContentTpl->setVariable('SPECIAL_STYLE', 'inactive_option');
} else {
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$strActive = '';
}
if (isset($elem['config_id']) && (int)$elem['config_id'] === 0) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), htmlspecialchars(
$elem['value'],
ENT_QUOTES
) . ' [common]' . $strActive);
} else {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), htmlspecialchars(
$elem['value'],
ENT_QUOTES
) . $strActive);
}
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', $elem['key']);
/** @noinspection DisconnectedForeachInstructionInspection */
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
if ($intSelId === (int)$elem['key']) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_SEL', 'selected');
}
/** @noinspection DisconnectedForeachInstructionInspection */
$this->myContentTpl->parse($strTemplKey);
}
$intReturn = 0;
}
return $intReturn;
}
/**
* Get raw table data
* @param string $strTable Data table name
* @param string $strTabField Data field name
* @param array $arrData Raw data array (by reference)
* @param int $intOption Option value
* @return int 0 = successful / 1 = error
*/
public function getSelectRawdata(string $strTable, string $strTabField, array &$arrData, int $intOption = 0): int
{
/* Define variables */
$arrDataRaw = array();
$intDataCount = 0;
$intReturn = 0;
$intDouble = 0;
/* Get link rights */
$strAccess = $this->getAccessGroups('link');
/* Common domain is enabled? */
$this->myConfigClass->getDomainData('enable_common', $strCommonEnable);
$intCommonEnable = (int)$strCommonEnable;
if ($intCommonEnable === 1) {
$strDomainWhere1 = ' (`config_id`=' . $this->intDomainId . ' OR `config_id`=0) ';
$strDomainWhere2 = ' (`tbl_service`.`config_id`=' . $this->intDomainId . ' OR `tbl_service`.`config_id`=0) ';
} else {
$strDomainWhere1 = ' `config_id`=' . $this->intDomainId . ' ';
$strDomainWhere2 = ' `tbl_service`.`config_id`=' . $this->intDomainId . ' ';
}
/* Define SQL commands */
if ($strTable === 'tbl_group') {
$strSQL = $this->getRawDataSQLGroup($strTabField);
} elseif (($strTable === 'tbl_configtarget') || ($strTable === 'tbl_datadomain') ||
($strTable === 'tbl_language')) {
$strSQL = $this->getRawDataSQLDomain($strTable, $strTabField);
} elseif ($strTable === 'tbl_command') {
$strSQL = $this->getRawDataSQLCommand($strTabField, $strDomainWhere1, $strAccess, $intOption);
} elseif (($strTable === 'tbl_timeperiod') && ($strTabField === 'name')) {
$strSQL = $this->getRawDataSQLTimeperiod($strDomainWhere1, $strAccess);
} elseif (($strTable === 'tbl_service') && ($intOption === 3)) {
$strSQL = $this->getRawDataSQLService3($strDomainWhere2, $strAccess);
$intDouble = 1;
} elseif (($strTable === 'tbl_service') && (($intOption === 4) || ($intOption === 5) || ($intOption === 6))) {
$strSQL = $this->getRawDataSQLService456($strTabField, $intOption, $strDomainWhere1, $strAccess);
} elseif (($strTable === 'tbl_service') && ($intOption === 7)) {
if (isset($this->arrSession['refresh']['se_host'])) {
$intHostId = $this->arrSession['refresh']['se_host'];
$strSQL = $this->getRawDataSQLService7($strTabField, $strDomainWhere1, $intHostId, $strAccess);
} else {
$strSQL = '';
}
} elseif ((($strTable === 'tbl_service') || ($strTable === 'tbl_servicetemplate')) &&
(($intOption === 8) || ($intOption === 9))) {
/* Service selection inside Host definition */
$strSQL = $this->getRawDataSQLService89($strDomainWhere1, $strAccess);
} elseif ((($strTable === 'tbl_service') || ($strTable === 'tbl_servicetemplate')) &&
($intOption === 10)) {
/* Service selection inside Host definition */
$strSQL = $this->getRawDataSQLService10($strDomainWhere2, $strAccess);
} else {
/* Common statement */
$strSQL = $this->getRawDataSQLCommon($strTable, $strTabField, $strDomainWhere1, $strAccess);
}
/* Process data */
if ($strSQL !== '') {
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataRaw, $intDataCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
$intReturn = 1;
}
if ($intDouble === 1) {
$arrDataRawTemp = array();
$arrKey = array();
foreach ($arrDataRaw as $elem) {
if (!isset($arrKey[$elem['key']])) {
$arrKey[$elem['key']] = 1;
$arrDataRawTemp[] = $elem;
}
}
$arrDataRaw = $arrDataRawTemp;
}
}
if ($strTable === 'tbl_group') {
$arrTemp = array();
$arrTemp['key'] = 0;
$arrTemp['value'] = translate('Unrestricted access');
$arrData[] = $arrTemp;
}
if (($intReturn === 0) && ($intDataCount !== 0)) {
foreach ($arrDataRaw as $elem) {
$arrData[] = $elem;
}
} elseif ($strTable !== 'tbl_group') {
$arrData = array('key' => 0, 'value' => 'no data');
$intReturn = 1;
}
return $intReturn;
}
/**
* Define SQL commands for group table
* @param string $strTabField Table field
* @return string SQL Statement
*/
private function getRawDataSQLGroup(string $strTabField): string
{
return 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` ' .
"FROM `tbl_group` WHERE `active`='1' AND `" . $strTabField . "` <> '' " .
'AND `' . $strTabField . '` IS NOT NULL ORDER BY `' . $strTabField . '`';
}
/**
* Define SQL commands for configtarget, datadomain and language table
* @param string $strTable Table name
* @param string $strTabField Table field
* @return string SQL Statement
*/
private function getRawDataSQLDomain(string $strTable, string $strTabField): string
{
return 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` ' .
'FROM `' . $strTable . '` WHERE `' . $strTabField . "` <> '' AND `" . $strTabField .
'` IS NOT NULL ORDER BY `' . $strTabField . '`';
}
/**
* Define SQL commands for command table
* @param string $strTabField Table field
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $strAccess Access groups
* @param int $intOption Command type option
* @return string SQL Statement
*/
private function getRawDataSQLCommand(string $strTabField, string $strDomainWhere1, string $strAccess, int $intOption): string
{
return 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `config_id`, `active` ' .
"FROM `tbl_command` WHERE $strDomainWhere1 AND `" . $strTabField . "` <> '' AND `" .
$strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) AND (`command_type` = 0 " .
'OR `command_type` = ' . $intOption . ') ORDER BY `' . $strTabField . '`';
}
/**
* Define SQL commands for timeperiod table
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLTimeperiod(string $strDomainWhere1, string $strAccess): string
{
return 'SELECT `id` AS `key`, `name` AS `value`, `config_id`, `active` ' .
"FROM `tbl_timeperiod` WHERE $strDomainWhere1 AND `name` <> '' AND `name` IS NOT NULL " .
"AND `access_group` IN ($strAccess) ORDER BY value";
}
/**
* Define SQL commands for service table
* @param string $strDomainWhere2 WHERE SQL domain part
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService3(string $strDomainWhere2, string $strAccess): string
{
$strSQLPart1 = "WHERE $strDomainWhere2 AND `tbl_service`.`service_description` <> '' " .
'AND `tbl_service`.`service_description` IS NOT NULL AND `tbl_service`.`hostgroup_name` <> 0 ' .
"AND `tbl_service`.`access_group` IN ($strAccess) ";
return "SELECT CONCAT_WS('::',`tbl_host`.`id`,'0',`tbl_service`.`id`) AS `key`, " .
"CONCAT('H:',`tbl_host`.`host_name`,',',`tbl_service`.`service_description`) AS `value`, " .
'`tbl_service`.`active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHost` ON `tbl_service`.`id` = `tbl_lnkServiceToHost`.`idMaster` ' .
'LEFT JOIN `tbl_host` ON `tbl_lnkServiceToHost`.`idSlave` = `tbl_host`.`id` ' .
str_replace('hostgroup_name', 'host_name', $strSQLPart1) .
'UNION ' .
"SELECT CONCAT_WS('::','0',`tbl_hostgroup`.`id`,`tbl_service`.`id`) AS `key`, " .
"CONCAT('HG:',`tbl_hostgroup`.`hostgroup_name`,',',`tbl_service`.`service_description`) " .
'AS `value`, `tbl_service`.`active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster`' .
'LEFT JOIN `tbl_hostgroup` ON `tbl_lnkServiceToHostgroup`.`idSlave` = `tbl_hostgroup`.`id` ' .
$strSQLPart1 .
'UNION ' .
"SELECT CONCAT_WS('::',`tbl_host`.`id`,'0',`tbl_service`.`id`) AS `key`, " .
"CONCAT('HHG:',`tbl_host`.`host_name`,',',`tbl_service`.`service_description`) AS `value`, " .
'`tbl_service`.`active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster`' .
'LEFT JOIN `tbl_lnkHostgroupToHost` ON `tbl_lnkHostgroupToHost`.`idMaster` = ' .
'`tbl_lnkServiceToHostgroup`.`idSlave` ' .
'LEFT JOIN `tbl_host` ON `tbl_lnkHostgroupToHost`.`idSlave` = `tbl_host`.`id` ' .
$strSQLPart1 .
'UNION ' .
"SELECT CONCAT_WS('::',`tbl_host`.`id`,'0',`tbl_service`.`id`) AS `key`, " .
"CONCAT('HGH:',`tbl_host`.`host_name`,',',`tbl_service`.`service_description`) AS `value`, " .
'`tbl_service`.`active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
'LEFT JOIN `tbl_lnkHostToHostgroup` ON `tbl_lnkHostToHostgroup`.`idSlave` = ' .
'`tbl_lnkServiceToHostgroup`.`idSlave` ' .
'LEFT JOIN `tbl_host` ON `tbl_lnkHostToHostgroup`.`idMaster` = `tbl_host`.`id` ' .
$strSQLPart1 .
'ORDER BY value';
}
/**
* Define SQL commands for service table
* @param string $strTabField Table field
* @param int $intOption Option ID
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService456(string $strTabField, int $intOption, string $strDomainWhere1, string $strAccess): string
{
/* Define variables */
if ($intOption === 6) {
$strHostVar = 'se_host';
$strHostGroupVar = 'se_hostgroup';
} elseif ($intOption === 4) {
$strHostVar = 'sd_dependent_host';
$strHostGroupVar = 'sd_dependent_hostgroup';
} else {
$strHostVar = 'sd_host';
$strHostGroupVar = 'sd_hostgroup';
}
if (!isset($this->arrSession['refresh'])) {
$this->arrSession['refresh'] = array();
}
$arrHosts = array();
$arrHostgroups = array();
$arrServices = array();
$arrDataHost = array();
$arrDataTmp = array();
$arrHostTemp = array();
$arrHostgroupTemp = array();
$arrServicesId = array();
$intDCHost = 0;
$intDataTmp = 0;
/* Refresh mode - fill arrays */
if (isset($this->arrSession['refresh'][$strHostVar]) &&
is_array($this->arrSession['refresh'][$strHostVar])) {
$arrHosts = $this->arrSession['refresh'][$strHostVar];
} else {
if ($intOption === 4) {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServicedependencyToHost_DH` '
. 'WHERE `idMaster`=' . $this->intDataId;
} elseif ($intOption === 6) {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServiceescalationToHost` '
. 'WHERE `idMaster`=' . $this->intDataId;
} else {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServicedependencyToHost_H` '
. 'WHERE `idMaster`=' . $this->intDataId;
}
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHost, $intDCHost);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
} elseif ($intDCHost !== 0) {
$arrHostTemp = array();
foreach ($arrDataHost as $elem) {
$arrHostTemp[] = $elem['idSlave'];
}
$arrHosts = $arrHostTemp;
}
}
if (isset($this->arrSession['refresh'][$strHostGroupVar]) &&
is_array($this->arrSession['refresh'][$strHostGroupVar])) {
$arrHostgroups = $this->arrSession['refresh'][$strHostGroupVar];
} else {
if ($intOption === 4) {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServicedependencyToHostgroup_DH` '
. 'WHERE `idMaster`=' . $this->intDataId;
} elseif ($intOption === 6) {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServiceescalationToHostgroup` '
. 'WHERE `idMaster`=' . $this->intDataId;
} else {
$strSQL = 'SELECT `idSlave` FROM `tbl_lnkServicedependencyToHostgroup_H` '
. 'WHERE `idMaster`=' . $this->intDataId;
}
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHost, $intDCHost);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
} elseif ($intDCHost !== 0) {
$arrHostgroupTemp = array();
foreach ($arrDataHost as $elem) {
$arrHostgroupTemp[] = $elem['idSlave'];
}
$arrHostgroups = $arrHostgroupTemp;
}
}
if (is_array($arrHosts) && (count($arrHosts) === 1) && (string)$arrHosts[0] === '') {
$arrHosts = array();
}
if (is_array($arrHostgroups) && (count($arrHostgroups) === 1) && (string)$arrHostgroups[0] === '') {
$arrHostgroups = array();
}
if (in_array('*', $arrHosts, true)) {
$strSQL = "SELECT id FROM tbl_host WHERE $strDomainWhere1 AND `access_group` IN ($strAccess)";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHost, $intDCHost);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
if ($booReturn && ($intDCHost !== 0)) {
$arrHostTemp = array();
foreach ($arrDataHost as $elem) {
if (in_array('e' . $elem['id'], $this->arrSession['refresh'][$strHostVar], true)) {
continue;
}
$arrHostTemp[] = $elem['id'];
}
}
$intHosts = 1;
$arrHosts = $arrHostTemp;
} else {
$intHosts = count($arrHosts);
}
/* Value in host groups -> disabled in NagiosQL 3.2 */
if (in_array('*', $arrHostgroups, true)) {
$strSQL = "SELECT id FROM tbl_hostgroup WHERE $strDomainWhere1 AND `access_group` " .
"IN ($strAccess)";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHost, $intDCHost);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
if ($booReturn && ($intDCHost !== 0)) {
$arrHostgroupTemp = array();
foreach ($arrDataHost as $elem) {
if (in_array('e' . $elem['id'], $this->arrSession['refresh'][$strHostGroupVar], true)) {
continue;
}
$arrHostgroupTemp[] = $elem['id'];
}
}
$intHostsGroup = 1;
$arrHostgroups = $arrHostgroupTemp;
} else {
$intHostsGroup = count($arrHostgroups);
}
/* Special method - only host_name or hostgroup_name selected */
if (($strHostVar === 'sd_dependent_host') && ($intHosts === 0) && ($intHostsGroup === 0)) {
if (is_array($this->arrSession['refresh']['sd_host'])) {
$arrHosts = $this->arrSession['refresh']['sd_host'];
}
if (is_array($this->arrSession['refresh']['sd_hostgroup'])) {
$arrHostgroups = $this->arrSession['refresh']['sd_hostgroup'];
}
if ((count($arrHosts) === 1) && (string)$arrHosts[0] === '') {
$arrHosts = array();
}
if ((count($arrHostgroups) === 1) && (string)$arrHostgroups[0] === '') {
$arrHostgroups = array();
}
$intHosts = count($arrHosts);
$intHostsGroup = count($arrHostgroups);
}
/* If no hosts and hostgroups are selected show any service */
if (($intHosts === 0) && ($intHostsGroup === 0)) {
$strSQL = 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` FROM `tbl_service` ' .
"WHERE $strDomainWhere1 AND `" . $strTabField . "` <> '' AND `" . $strTabField . '` ' .
"IS NOT NULL AND `access_group` IN ($strAccess) GROUP BY `value` ORDER BY `value`";
} else {
if ($intHosts !== 0) {
$intCounter = 0;
foreach ($arrHosts as $elem) {
if (($intCounter !== 0) && (count($arrServices) === 0)) {
continue;
}
$arrTempServ = array();
$arrTempServId = array();
$elem = str_replace('e', '', $elem);
$strSQLTmp = $this->getRawDataSQLService4($strDomainWhere1, $elem, $strAccess);
$booReturn = $this->myDBClass->hasDataArray($strSQLTmp, $arrDataTmp, $intDataTmp);
if ($booReturn && ($intDataTmp !== 0)) {
foreach ($arrDataTmp as $elem2) {
if ($intCounter === 0) {
$arrTempServ[] = $elem2['service_description'];
$arrTempServId[] = $elem2['id'];
} elseif (in_array($elem2['service_description'], $arrServices, true) &&
!in_array($elem2['service_description'], $arrTempServ, true)) {
$arrTempServ[] = $elem2['service_description'];
$arrTempServId[] = $elem2['id'];
}
}
}
$arrServices = $arrTempServ;
$arrServicesId = $arrTempServId;
$intCounter++;
}
}
if ($intHostsGroup !== 0) {
$intCounter = 0;
foreach ($arrHostgroups as $elem) {
if (($intCounter !== 0) && (count($arrServices) === 0)) {
continue;
}
$arrTempServ = array();
$arrTempServId = array();
$elem = str_replace('e', '', $elem);
$strSQLTmp = $this->getRawDataSQLService5($strDomainWhere1, $elem, $strAccess);
$booReturn = $this->myDBClass->hasDataArray($strSQLTmp, $arrDataTmp, $intDataTmp);
if ($booReturn && ($intDataTmp !== 0)) {
foreach ($arrDataTmp as $elem2) {
if ($intCounter === 0) {
$arrTempServ[] = $elem2['service_description'];
$arrTempServId[] = $elem2['id'];
} elseif (in_array($elem2['service_description'], $arrServices, true) &&
!in_array($elem2['service_description'], $arrTempServ, true)) {
$arrTempServ[] = $elem2['service_description'];
$arrTempServId[] = $elem2['id'];
}
}
}
$arrServices = $arrTempServ;
$arrServicesId = $arrTempServId;
$intCounter++;
}
}
if (count($arrServices) !== 0) {
$strServices = "'" . implode("','", $arrServices) . "'";
$strServicesId = implode(',', $arrServicesId);
$strSQL = $this->getRawDataSQLService6(
$strTabField,
$strDomainWhere1,
$strServices,
$strServicesId,
$strAccess
);
} else {
$strSQL = '';
}
}
return $strSQL;
}
/**
* Define SQL commands for service table
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $elem Host array
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService4(string $strDomainWhere1, string $elem, string $strAccess): string
{
return 'SELECT `id`, `service_description` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHost` ON `tbl_service`.`id` = `tbl_lnkServiceToHost`.`idMaster` ' .
"WHERE $strDomainWhere1 AND `tbl_lnkServiceToHost`.`idSlave` = $elem AND `service_description`<>'' " .
"AND `access_group` IN ($strAccess) " .
'UNION ' .
'SELECT `id`, `service_description` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
'LEFT JOIN `tbl_lnkHostToHostgroup` ON `tbl_lnkServiceToHostgroup`.`idSlave` = ' .
'`tbl_lnkHostToHostgroup`.`idSlave` ' .
"WHERE $strDomainWhere1 AND `tbl_lnkHostToHostgroup`.`idMaster`=$elem AND `service_description`<>'' " .
"AND `access_group` IN ($strAccess) " .
'UNION ' .
'SELECT `id`, `service_description` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
'LEFT JOIN `tbl_lnkHostgroupToHost` ON `tbl_lnkServiceToHostgroup`.`idSlave` = ' .
'`tbl_lnkHostgroupToHost`.`idMaster` ' .
"WHERE $strDomainWhere1 AND `tbl_lnkHostgroupToHost`.`idSlave`=$elem AND `service_description`<>'' " .
"AND `access_group` IN ($strAccess)";
}
/**
* Define SQL commands for service table
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $elem Hostgroup array
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService5(string $strDomainWhere1, string $elem, string $strAccess): string
{
return 'SELECT `id`, `service_description` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
"WHERE $strDomainWhere1 AND `tbl_lnkServiceToHostgroup`.`idSlave` = $elem " .
"AND `service_description` <> '' AND `access_group` " .
"IN ($strAccess)";
}
/**
* Define SQL commands for service table
* @param string $strTabField Table field
* @param string $strWhere WHERE SQL domain part
* @param string $strServices Comma separated list of services
* @param string $strServicesId Comma separated list of services IDs
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService6(string $strTabField, string $strWhere, string $strServices, string $strServicesId, string $strAccess): string
{
return 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHost` ON `tbl_service`.`id` = `tbl_lnkServiceToHost`.`idMaster` ' .
"WHERE $strWhere AND `tbl_service`.`service_description` IN ($strServices) " .
"AND `tbl_service`.`id` IN ($strServicesId) AND `" . $strTabField . "` <> '' AND `" .
$strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) GROUP BY `value` " .
'UNION ' .
'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `tbl_service`.`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' .
"WHERE $strWhere AND `tbl_service`.`service_description` IN ($strServices) " .
"AND `tbl_service`.`id` IN ($strServicesId) AND `" . $strTabField . "` <> '' AND `" .
$strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) GROUP BY `value` " .
'UNION ' .
'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `active` FROM `tbl_service` ' .
"WHERE $strWhere AND `host_name`=2 OR `hostgroup_name`=2 AND `" . $strTabField . "` <> '' " .
'AND `' . $strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) " .
'GROUP BY `value` ORDER BY `value`';
}
/**
* Define SQL commands for service table
* @param string $strTabField Table field
* @param string $strDomainWhere1 WHERE SQL domain part
* @param int $intHostId Host ID
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService7(string $strTabField, string $strDomainWhere1, int $intHostId, string $strAccess): string
{
return 'SELECT `tbl_service`.`id` AS `key`, `tbl_service`.`' . $strTabField . '` AS `value`, ' .
'`tbl_service`.`active` FROM `tbl_service` ' .
'LEFT JOIN `tbl_lnkServiceToHost` ON `tbl_service`.`id` = `tbl_lnkServiceToHost`.`idMaster` ' .
"WHERE $strDomainWhere1 AND `tbl_lnkServiceToHost`.`idSlave` = $intHostId AND `" . $strTabField .
"` <> '' AND `" . $strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) " .
'ORDER BY `' . $strTabField . '`';
}
/**
* Define SQL commands for service table
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService89(string $strDomainWhere1, string $strAccess): string
{
return "SELECT `tbl_service`.`id` AS `key`, CONCAT(`tbl_service`.`config_name`, ' - ', " .
'`tbl_service`.`service_description`) AS `value`, `active` ' .
"FROM `tbl_service` WHERE $strDomainWhere1 AND `tbl_service`.`config_name` <> '' " .
"AND `tbl_service`.`config_name` IS NOT NULL AND `tbl_service`.`service_description` <> '' " .
"AND `tbl_service`.`service_description` IS NOT NULL AND `access_group` IN ($strAccess) " .
'ORDER BY `value`';
}
/**
* Define SQL commands for service table
* @param string $strDomainWhere2 WHERE SQL domain part for services
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLService10(string $strDomainWhere2, string $strAccess): string
{
return 'SELECT CONCAT(tbl_service.id, "-", tbl_host.id) AS `key`, CONCAT(tbl_host.host_name, " - ", '
. 'tbl_service.service_description) AS `value`, tbl_service.active '
. 'FROM tbl_service '
. 'LEFT JOIN tbl_lnkServiceToHost ON tbl_service.id=tbl_lnkServiceToHost.idMaster '
. 'LEFT JOIN tbl_host ON tbl_lnkServiceToHost.idSlave=tbl_host.id '
. 'WHERE ' . $strDomainWhere2 . ' AND tbl_service.service_description <> "" '
. 'AND tbl_service.service_description IS NOT NULL AND tbl_host.host_name IS NOT NULL '
. 'AND tbl_service.access_group IN (' . $strAccess . ') '
. 'UNION '
. 'SELECT CONCAT(tbl_service.id, "-", tbl_host.id) AS `key`, CONCAT(tbl_host.host_name, " - ", '
. 'tbl_service.service_description) AS `value`, tbl_service.active '
. 'FROM tbl_service '
. 'LEFT JOIN tbl_lnkServiceToHostgroup ON tbl_service.id=tbl_lnkServiceToHostgroup.idMaster '
. 'LEFT JOIN tbl_lnkHostgroupToHost ON tbl_lnkServiceToHostgroup.idSlave = '
. 'tbl_lnkHostgroupToHost.idMaster '
. 'LEFT JOIN tbl_host ON tbl_lnkHostgroupToHost.idSlave=tbl_host.id '
. 'WHERE ' . $strDomainWhere2 . ' AND tbl_service.service_description <> "" '
. 'AND tbl_service.service_description IS NOT NULL AND tbl_host.host_name IS NOT NULL '
. 'AND tbl_service.access_group IN (' . $strAccess . ') '
. 'ORDER BY `value`';
}
/**
* Define SQL commands for common tables
* @param string $strTable Table name
* @param string $strTabField Table field
* @param string $strDomainWhere1 WHERE SQL domain part
* @param string $strAccess Access groups
* @return string SQL Statement
*/
private function getRawDataSQLCommon(string $strTable, string $strTabField, string $strDomainWhere1, string $strAccess): string
{
return 'SELECT `id` AS `key`, `' . $strTabField . '` AS `value`, `config_id`, `active` ' .
'FROM `' . $strTable . "` WHERE $strDomainWhere1 AND `" . $strTabField . "` <> '' " .
'AND `' . $strTabField . "` IS NOT NULL AND `access_group` IN ($strAccess) " .
'ORDER BY `' . $strTabField . '`';
}
/**
* Builds a multi selection field inside a template
* @param string $strTable Table name (source data)
* @param string $strTabField Field name (source data)
* @param string $strTemplKey Template key
* @param string $strLinkTable Name of link table
* @param int $intModeId 0 = only data
* 1 = with empty line at the beginning
* 2 = with * line at the beginning
* @param int $intTypeId Type ID (from master table)
* @param int $intExclId Exclude ID
* @param string $strRefresh Session token for refresh mode
* @return int 0 = successful / 1 = error
*/
public function parseSelectMulti(
string $strTable,
string $strTabField,
string $strTemplKey,
string $strLinkTable,
int $intModeId = 0,
int $intTypeId = -9,
int $intExclId = -9,
string $strRefresh = ''
): int
{
/* Compute option value */
$intOption = 2;
$intRefresh = 0;
$intReturn = 1;
$arrSelectedAdd = array();
$arrData = array();
$intSelAdd = 1;
if ($strLinkTable === 'tbl_lnkServicegroupToService') {
$intOption = 3;
}
if ($strLinkTable === 'tbl_lnkServicedependencyToService_DS') {
$intOption = 4;
}
if ($strLinkTable === 'tbl_lnkServicedependencyToService_S') {
$intOption = 5;
}
if ($strLinkTable === 'tbl_lnkServiceescalationToService') {
$intOption = 6;
}
if ($strTemplKey === 'host_services') {
$intOption = 8;
}
if ($strTemplKey === 'service_parents') {
$intOption = 9;
}
if (($strLinkTable === 'tbl_lnkServiceToService') || ($strLinkTable === 'tbl_lnkServicetemplateToService')) {
$intOption = 10;
}
/* Get version */
$this->myConfigClass->getDomainData('version', $strVersion);
$intVersion = (int)$strVersion;
/* Get raw data */
$intRaw = $this->getSelectRawdata($strTable, $strTabField, $arrData, $intOption);
/* Get selected data */
$arrSelected = array();
$intSel = $this->getSelectedItems($strLinkTable, $arrSelected, $intOption);
/* Get additional selected data */
if ($strLinkTable === 'tbl_lnkHostToHostgroup') {
$intSelAdd = $this->getSelectedItems('tbl_lnkHostgroupToHost', $arrSelectedAdd, 8);
}
if ($strLinkTable === 'tbl_lnkHostgroupToHost') {
$intSelAdd = $this->getSelectedItems('tbl_lnkHostToHostgroup', $arrSelectedAdd, 8);
}
/* Get browser */
$strBrowser = $this->browserCheck();
/* Refresh processing (replaces selection array) */
if (isset($this->arrSession['refresh'][$strRefresh]) &&
$strRefresh !== '' && is_array($this->arrSession['refresh'][$strRefresh])) {
$arrSelected = $this->arrSession['refresh'][$strRefresh];
$intRefresh = 1;
$intSel = 0;
}
if ($intRaw === 0) {
$intCount = 0;
/* Insert an empty line in mode 1 */
if ($intModeId === 1) {
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$this->myContentTpl->setVariable('OPTION_DISABLED');
if (($strBrowser === 'msie') && ((int)$this->arrSettings['common']['seldisable'] !== 0)) {
$this->myContentTpl->setVariable('OPTION_DISABLED', 'disabled="disabled"');
}
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), ' ');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', 0);
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
$this->myContentTpl->parse($strTemplKey);
$intCount++;
}
/* Insert an * line in mode 2 */
if ($intModeId === 2) {
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$this->myContentTpl->setVariable('OPTION_DISABLED');
if (($strBrowser === 'msie') && ((int)$this->arrSettings['common']['seldisable'] !== 0)) {
$this->myContentTpl->setVariable('OPTION_DISABLED', 'disabled="disabled"');
}
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), '*');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', '*');
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
if ($intTypeId === 2) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_SEL', 'selected');
$this->myContentTpl->setVariable('IE_' . strtoupper($strTemplKey) . '_SEL', 'ieselected');
}
if (($intRefresh === 1) && in_array('*', $arrSelected, true)) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_SEL', 'selected');
$this->myContentTpl->setVariable('IE_' . strtoupper($strTemplKey) . '_SEL', 'ieselected');
}
$intCount++;
$this->myContentTpl->parse($strTemplKey);
}
/* Insert data sets */
foreach ($arrData as $elem) {
if ((int)$elem['key'] === $intExclId) {
continue;
}
if (($intOption === 10) && ((int)strstr($elem['key'], '-', true) === $intExclId)) {
continue;
}
if ((string)$elem['value'] === '') {
continue;
}
$intIsSelected = 0;
$intIsExcluded = 0;
$intIsForeign = 0;
$this->myContentTpl->setVariable('SPECIAL_STYLE');
$this->myContentTpl->setVariable('OPTION_DISABLED');
if (($strBrowser === 'msie') && ((int)$this->arrSettings['common']['seldisable'] !== 0)) {
$this->myContentTpl->setVariable('OPTION_DISABLED', 'disabled="disabled"');
}
if (isset($elem['active']) && (int)$elem['active'] === 0) {
$strActive = ' [inactive]';
$this->myContentTpl->setVariable('SPECIAL_STYLE', 'inactive_option');
} else {
$strActive = '';
}
if (isset($elem['config_id']) && (int)$elem['config_id'] === 0) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), htmlspecialchars(
$elem['value'],
ENT_QUOTES
) . ' [common]' . $strActive);
} else {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), htmlspecialchars(
$elem['value'],
ENT_QUOTES
) . $strActive);
}
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', $elem['key']);
$this->myContentTpl->setVariable('CLASS_SEL');
if ($intVersion < 3) {
$this->myContentTpl->setVariable('VERSION_20_MUST', 'inpmust');
}
if (($intSel === 0) && in_array($elem['key'], $arrSelected, true)) {
$intIsSelected = 1;
}
if (($intSel === 0) && in_array($elem['value'], $arrSelected, true)) {
$intIsSelected = 1;
}
if (($intSelAdd === 0) && in_array($elem['key'], $arrSelectedAdd, true)) {
$intIsForeign = 1;
}
if (($intSelAdd === 0) && in_array($elem['value'], $arrSelectedAdd, true)) {
$intIsForeign = 1;
}
if (($intIsForeign === 1) && ($strActive === '')) {
$this->myContentTpl->setVariable('SPECIAL_STYLE', 'foreign_option');
}
/* Exclude rule */
if (($intSel === 0) && in_array('e' . $elem['key'], $arrSelected, true)) {
$intIsExcluded = 1;
}
if (($intSel === 0) && in_array('e' . '::' . $elem['value'], $arrSelected, true)) {
$intIsExcluded = 1;
}
if ($intIsExcluded === 1) {
if (isset($elem['config_id']) && (int)$elem['config_id'] === 0) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), '!' .
htmlspecialchars($elem['value'], ENT_QUOTES) . ' [common]' . $strActive);
} else {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), '!' .
htmlspecialchars($elem['value'], ENT_QUOTES) . $strActive);
}
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', 'e' . $elem['key']);
}
if (($intIsSelected === 1) || ($intIsExcluded === 1)) {
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_SEL', 'selected');
$this->myContentTpl->setVariable('IE_' . strtoupper($strTemplKey) . '_SEL', 'ieselected');
}
$intCount++;
$this->myContentTpl->parse($strTemplKey);
}
if ($intCount === 0) {
/* Insert an empty line to create valid HTML select fields */
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), ' ');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', 0);
$this->myContentTpl->parse($strTemplKey);
}
$intReturn = 0;
} else {
/* Insert an empty line to create valid HTML select fields */
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey), ' ');
$this->myContentTpl->setVariable('DAT_' . strtoupper($strTemplKey) . '_ID', 0);
$this->myContentTpl->parse($strTemplKey);
}
return $intReturn;
}
/**
* Get selected data
* @param string $strLinkTable Link table name
* @param array $arrSelect Result data array
* @param int $intOption Option parameter
* @return int 0 = successful / 1 = error
*/
private function getSelectedItems(string $strLinkTable, array &$arrSelect, int $intOption = 0): int
{
/* Define variables */
$arrSelectedRaw = array();
$intDataCount = 0;
$intReturn = 1;
/* Define SQL commands */
if ($intOption === 8) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $strLinkTable . '` WHERE `idSlave`=' . $this->intDataId;
} else {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $strLinkTable . '` WHERE `idMaster`=' . $this->intDataId;
}
/* Process data */
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrSelectedRaw, $intDataCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
if ($booReturn && ($intDataCount !== 0)) {
foreach ($arrSelectedRaw as $elem) {
/* Multi tables */
if ($strLinkTable === 'tbl_lnkServicegroupToService') {
if (isset($elem['exclude']) && ((int)$elem['exclude'] === 1)) {
$arrSelect[] = 'e' . $elem['idSlaveH'] . '::' . $elem['idSlaveHG'] . '::' . $elem['idSlaveS'];
} else {
$arrSelect[] = $elem['idSlaveH'] . '::' . $elem['idSlaveHG'] . '::' . $elem['idSlaveS'];
}
/* Servicedependencies and -escalations
} elseif (($strLinkTable === 'tbl_lnkServicedependencyToService_DS') ||
($strLinkTable === 'tbl_lnkServicedependencyToService_S') ||
($strLinkTable === 'tbl_lnkServiceescalationToService')) {
if (isset($elem['exclude']) && ((int)$elem['exclude'] === 1)) {
$arrSelect[] = 'e::' . $elem['strSlave'];
} else {
$arrSelect[] = $elem['strSlave'];
}
/* Service parents */
} elseif (($strLinkTable === 'tbl_lnkServiceToService') ||
($strLinkTable === 'tbl_lnkServicetemplateToService')) {
$arrSelect[] = $elem['idSlave'] . '-' . $elem['idHost'];
/* Standard tables */
} else if ($intOption === 8) {
if (isset($elem['exclude']) && ((int)$elem['exclude'] === 1)) {
$arrSelect[] = 'e' . $elem['idMaster'];
} else {
$arrSelect[] = $elem['idMaster'];
}
} else if (isset($elem['exclude']) && ((int)$elem['exclude'] === 1)) {
$arrSelect[] = 'e' . $elem['idSlave'];
} else {
$arrSelect[] = $elem['idSlave'];
}
}
$intReturn = 0;
}
return $intReturn;
}
/**
* Search for browser type
* @return string Browser String
*/
public function browserCheck(): string
{
$strUserAgent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_UNSAFE_RAW);
/* Define variables */
$strBrowserString = 'unknown';
if (false !== stripos($strUserAgent, 'msie')) {
$strBrowserString = 'msie';
} elseif (false !== stripos($strUserAgent, 'firefox')) {
$strBrowserString = 'firefox';
} elseif (false !== stripos($strUserAgent, 'opera')) {
$strBrowserString = 'opera';
} elseif (false !== stripos($strUserAgent, 'chrome')) {
$strBrowserString = 'chrome';
}
return $strBrowserString;
}
/**
* Merge message strings and check for duplicate messages
* @param string $strNewMessage Message to add
* @param string|null $strOldMessage Modified message string (by reference)
* @param string $strSeparate Separate string (
or \n)
*/
public function processMessage(string $strNewMessage, string &$strOldMessage = null, string $strSeparate = '
'): int
{
$strNewMessage = str_replace(array('::::', '::'), array('::', $strSeparate), $strNewMessage);
if (($strOldMessage !== '') && ($strNewMessage !== '')) {
if (substr_count($strOldMessage, $strNewMessage) === 0) {
if (substr_count(substr($strOldMessage, -5), $strSeparate) === 0) {
$strOldMessage .= $strSeparate . $strNewMessage;
} else {
$strOldMessage .= $strNewMessage;
}
}
} else {
$strOldMessage .= $strNewMessage;
}
return 0;
}
/**
* Inserts the domain list to the list view template (host and services only)
* @param HTML_Template_IT $resTemplate Template object
* @noinspection PhpMissingParamTypeInspection
*/
public function insertDomainList($resTemplate): int
{
$arrDataDomain = array();
$strSQL = "SELECT * FROM `tbl_datadomain` WHERE `active` <> '0' ORDER BY `domain`";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataDomain, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
foreach ($arrDataDomain as $elem) {
/* Check access rights */
if ($this->checkAccountGroup($elem['access_group'], 'read') === 0) {
$resTemplate->setVariable('DOMAIN_ID', $elem['id']);
$resTemplate->setVariable('DOMAIN_NAME', $elem['domain']);
if ($this->intDomainId === (int)$elem['id']) {
$resTemplate->setVariable('DOMAIN_SEL', 'selected');
}
$resTemplate->parse('domainlist');
}
}
} elseif (!$booReturn) {
$this->strErrorMessage .= translate('Error while selecting data from database:') .
'::' . $this->myDBClass->strErrorMessage;
}
return 0;
}
/**
* Checks if user has access to an account group
* @param int $intGroupId Group ID
* @param string $strType Access type (read,write,link)
* @return int 0 = access granted / 1 = no access
*/
public function checkAccountGroup(int $intGroupId, string $strType): int
{
/* Define variables */
$intReturn = 0;
/* Admin user or member og group 0 do not need permissions */
if (((int)$this->arrSession['userid'] !== 1) && ($intGroupId !== 0)) {
/* Define variables */
$arrDataMain = array();
/* Read database values */
$strTypeValue = $this->getGroupValue($strType);
if ($strTypeValue !== '') {
$strSQL = "SELECT * FROM `tbl_lnkGroupToUser` WHERE `idMaster`=$intGroupId AND " .
'`idSlave`=' . $this->arrSession['userid'] . " AND $strTypeValue";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataMain, $intDataCount);
if ($booReturn === false) {
$this->strErrorMessage .= $this->myDBClass->strErrorMessage;
}
if (($booReturn === false) || ($intDataCount === 0)) {
$intReturn = 1;
}
}
}
return $intReturn;
}
/**
* Adds a "/" after a parh string and replaces double "//" with "/"
* @param string $strPath Path string
* @return string Modified path string
*/
public function addSlash(string $strPath): string
{
if ($strPath === '') {
return '';
}
$strPath .= '/';
while (substr_count($strPath, '//') !== 0) {
$strPath = str_replace('//', '/', $strPath);
}
return $strPath;
}
/**
* Replaces "NULL" with -1
* @param string $strKey Process string
* @return string Modified process string
*/
public function checkNull(string $strKey): string
{
$strReturn = $strKey;
if (strtoupper($strKey) === 'NULL') {
$strReturn = '-1';
}
return $strReturn;
}
}