nagiosql/functions/NagDataClass.php
2025-08-08 11:12:01 +02:00

1646 lines
85 KiB
PHP

<?php
/* ----------------------------------------------------------------------------
NagiosQL
-------------------------------------------------------------------------------
(c) 2005-2022 by Martin Willisegger
Project : NagiosQL
Component : Data processing class
Website : https://sourceforge.net/projects/nagiosql/
Version : 3.5.0
GIT Repo : https://gitlab.com/wizonet/NagiosQL
-----------------------------------------------------------------------------*/
/* ----------------------------------------------------------------------------
Class: Data processing class
-------------------------------------------------------------------------------
Includes all functions used to manipulate the configuration data inside
the database
Name: NagDataClass
-----------------------------------------------------------------------------*/
namespace functions;
use function in_array;
use function is_array;
class NagDataClass
{
/* Define class variables */
public $arrSession = array(); /* Session content */
public $intDomainId = 0; /* Configuration domain ID */
public $strUserName = ''; /* Logged in Username */
public $strErrorMessage = ''; /* String including error messages */
public $strInfoMessage = ''; /* String including information messages */
/* Class includes */
/** @var MysqliDbClass */
public $myDBClass; /* Database class reference */
/** @var NagVisualClass */
public $myVisClass; /* NagiosQL visual class object */
/** @var NagConfigClass */
public $myConfigClass; /* NagiosQL configuration class object */
/**
* NagDataClass constructor.
* @param array $arrSession PHP Session array
*/
public function __construct(array $arrSession)
{
if (isset($arrSession['domain'])) {
$this->intDomainId = (int)$arrSession['domain'];
}
if (isset($arrSession['username'])) {
$this->strUserName = $arrSession['username'];
}
$this->arrSession = $arrSession;
}
/**
* Copies one or more records in a data table. Alternatively, an individual record ID
* are specified, or the values of the $_POST['chbId_n'] variable is used where n
* is the record ID.
* @param string $strTableName Table name
* @param string $strKeyField Key field of the table
* @param int $intDataId Single data ID to copy
* @param int $intDomainId Target domain ID
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataCopyEasy(string $strTableName, string $strKeyField, int $intDataId = 0, int $intDomainId = -1): int
{
/* Define variables */
$arrRelations = array();
$intError = 0;
$intNumber = 0;
$intReturn = 0;
$strAccess = $this->myVisClass->getAccessGroups('write');
if ($intDomainId === -1) {
$intDomainId = $this->intDomainId;
}
/* Get all data ID from target table */
$strAccWhere = "WHERE `access_group` IN ($strAccess)";
if (($strTableName === 'tbl_user') || ($strTableName === 'tbl_group')) {
$strAccWhere = '';
}
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . "` $strAccWhere ORDER BY `id`";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn === false) {
$this->processClassMessage(translate('Error while selecting data from database:') .
'::' . $this->myDBClass->strErrorMessage . '::', $this->strErrorMessage);
return 1;
}
if ($intDataCount !== 0) {
for ($i = 0; $i < $intDataCount; $i++) {
/* Skip common domain value */
if ((int)$arrData[$i]['id'] === 0) {
continue;
}
/* Build the name of the form variable */
$strChbName = 'chbId_' . $arrData[$i]['id'];
/* If a form variable with this name exists or a matching single data ID was passed */
if (((filter_input(INPUT_POST, $strChbName, FILTER_UNSAFE_RAW) !== null) && ($intDataId === 0)) ||
($intDataId === (int)$arrData[$i]['id'])) {
/* Get all data of this data ID */
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $strTableName . '` WHERE `id`=' . $arrData[$i]['id'];
$this->myDBClass->hasSingleDataset($strSQL, $arrData[$i]);
/* Build a temporary config name */
$strNewName = $this->buildTempConfigName(
$strTableName,
$strKeyField,
$intDomainId,
$intDataCount,
$arrData,
$i
);
/* Build the INSERT command based on the table name */
if ($strTableName === 'tbl_service') {
$strSQLInsert = $this->buildInsertSQL(
$strTableName,
'service_description',
$intDomainId,
$strNewName,
$arrData,
$i);
} else {
$strSQLInsert = $this->buildInsertSQL(
$strTableName,
$strKeyField,
$intDomainId,
$strNewName,
$arrData,
$i);
}
/* Insert the master dataset */
$intCheck = 0;
$booReturn = $this->myDBClass->insertData($strSQLInsert);
$intMasterId = $this->myDBClass->intLastId;
if ($booReturn === false) {
$intCheck++;
}
/* Copy relations */
if (($this->tableRelations($strTableName, $arrRelations) === 0) && ($intCheck === 0)) {
foreach ($arrRelations as $elem) {
/* Normal 1:n relation */
if ((int)$elem['type'] === 2) {
$intCheck = $this->insertRelationType2($arrData, $i, $elem, $intMasterId, $intCheck);
} elseif ((int)$elem['type'] === 3) { /* 1:n relation for templates */
$intCheck = $this->insertRelationType3($arrData, $i, $elem, $intMasterId, $intCheck);
} elseif ((int)$elem['type'] === 4) { /* Special relation for free variables */
$intCheck = $this->insertRelationType4($arrData, $i, $elem, $intMasterId, $intCheck);
} elseif ((int)$elem['type'] === 5) { /* 1:n relation for tbl_lnkServicegroupToService */
$intCheck = $this->insertRelationType5($arrData, $i, $elem, $intMasterId, $intCheck);
} elseif ((int)$elem['type'] === 6) { /* 1:n relation for services */
$intCheck = $this->insertRelationType6($arrData, $i, $elem, $intMasterId, $intCheck);
}
}
/* 1:n relation for time definitions */
if ($strTableName === 'tbl_timeperiod') {
$intCheck = $this->insertRelationTimedefinition($arrData, $i, $intMasterId, $intCheck);
}
/* 1:n relation for groups */
if ($strTableName === 'tbl_group') {
$intCheck = $this->insertRelationGroup($arrData, $i, $intMasterId, $intCheck);
}
/* 1:n relation for service to host connections */
if ($strTableName === 'tbl_host') {
$intCheck = $this->insertRelationHost($arrData, $i, $intMasterId, $intCheck);
}
}
/* Write logfile */
if ($intCheck !== 0) {
/* Error */
$intError++;
$this->writeLog(translate('Data set copy failed - table [new name]:') . ' ' . $strTableName
. ' [' . $strNewName . ']');
$this->processClassMessage(translate('Data set copy failed - table [new name]:') . ' ' .
$strTableName . ' [' . $strNewName . ']::', $this->strInfoMessage);
} else {
/* Success */
$this->writeLog(translate('Data set copied - table [new name]:') . ' ' . $strTableName .
' [' . $strNewName . ']');
$this->processClassMessage(translate('Data set copied - table [new name]:') . ' ' .
$strTableName . ' [' . $strNewName . ']::', $this->strInfoMessage);
}
$intNumber++;
}
}
/* Error processing */
if ($intNumber > 0) {
if ($intError === 0) {
/* Success */
$this->processClassMessage(translate('Data were successfully inserted to the data base!')
. '::', $this->strInfoMessage);
$this->updateStatusTable($strTableName);
} else {
/* Error */
$this->processClassMessage(translate('Error while inserting the data into the database:')
. '::' . $this->myDBClass->strErrorMessage, $this->strInfoMessage);
$intReturn = 1;
}
} else {
$this->processClassMessage(translate('No dataset copied. Maybe the dataset does not exist or you do ' .
'not have write permission.') . '::', $this->strErrorMessage);
$intReturn = 1;
}
} else {
$this->processClassMessage(translate('No dataset copied. Maybe the dataset does not exist or you do not ' .
'have write permission.') . '::', $this->strErrorMessage);
$intReturn = 1;
}
return $intReturn;
}
/**
* Merge message strings and check for duplicate messages
* @param string $strNewMessage New message to add
* @param string|null $strOldMessage Modified message string (by reference)
*/
public function processClassMessage(string $strNewMessage, string &$strOldMessage = null): int
{
$strNewMessage = str_replace('::::', '::', $strNewMessage);
if (($strOldMessage !== '') && ($strNewMessage !== '')) {
if (substr_count($strOldMessage, $strNewMessage) === 0) {
$strOldMessage .= $strNewMessage;
}
} else {
$strOldMessage .= $strNewMessage;
}
return 0;
}
/**
* Build a temporary configuration name
* @param string $strTableName Table name
* @param string $strKeyField Configuration field name
* @param int $intDomainId Domain ID
* @param int $intCount Dataset counter
* @param array $arrData Data array
* @param int $intID Data array key
* @return string Temporary configuration name
*/
private function buildTempConfigName(string $strTableName, string $strKeyField, int $intDomainId, int $intCount, array $arrData, int $intID): string
{
/* Define variables */
$strNewName = '';
for ($y = 1; $y <= $intCount; $y++) {
$strNewName = $arrData[$intID][$strKeyField] . " ($y)";
if (($strTableName === 'tbl_user') || ($strTableName === 'tbl_group') ||
($strTableName === 'tbl_datadomain') || ($strTableName === 'tbl_configtarget')) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` WHERE `' . $strKeyField . "`='$strNewName'";
} else if ($strTableName === 'tbl_service') {
$strNewName = $arrData[$intID]['service_description'] . " ($y)";
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` WHERE `' . $strKeyField . "`='" .
$arrData[$intID][$strKeyField] . "' AND `service_description`='$strNewName'";
} else {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ' .
'WHERE `' . $strKeyField . "`='$strNewName' AND `config_id`=$intDomainId";
}
$strFieldData = $this->myDBClass->getFieldData($strSQL);
/* If the name is unused -> break the loop */
if ($strFieldData === '') {
break;
}
}
/* Manually overwrite new name for extinfo tables */
if ($strTableName === 'tbl_hostextinfo') {
$strNewName = '0';
}
if ($strTableName === 'tbl_serviceextinfo') {
$strNewName = '0';
}
return $strNewName;
}
/**
* Build an INSERT command based on the table name
* @param string $strTableName Table name
* @param string $strKeyField Configuration field name
* @param int $intDomainId Domain ID
* @param string $strNewName New configuration name
* @param array $arrData Data array
* @param int $intID Data array key
* @return string SQL INSERT command
*/
private function buildInsertSQL(string $strTableName, string $strKeyField, int $intDomainId, string $strNewName, array $arrData, int $intID): string
{
/** @noinspection SqlResolve */
$strSQLInsert = 'INSERT INTO `' . $strTableName . '` SET `' . $strKeyField . "`='" . $strNewName . "'";
foreach ($arrData[$intID] as $key => $value) {
if ($value === null) {
$value = '';
}
if (($key !== $strKeyField) && ($key !== 'active') && ($key !== 'last_modified') &&
($key !== 'id') && ($key !== 'config_id')) {
/* Manually set some NULL values based on field names */
$value = $this->setNullValues($strTableName, $key, $value);
/* If the data value is not "NULL", add single quotes to the value */
if ($value !== 'NULL') {
$strSQLInsert .= ',`' . $key . "`='" . addslashes($value) . "'";
} else {
$strSQLInsert .= ',`' . $key . '`=' . $value;
}
}
}
if (($strTableName === 'tbl_user') || ($strTableName === 'tbl_group') ||
($strTableName === 'tbl_datadomain') || ($strTableName === 'tbl_configtarget')) {
$strSQLInsert .= ",`active`='0', `last_modified`=NOW()";
} else {
$strSQLInsert .= ",`active`='0', `config_id`=$intDomainId, `last_modified`=NOW()";
}
return $strSQLInsert;
}
/**
* Manually set some NULL values based on field names (key)
* @param string $strTableName Table name
* @param string $key Data key (field name)
* @param string $value Data value (field key)
* @return NULL|string Manipulated data value
*/
private function setNullValues(string $strTableName, string $key, string $value): ?string
{
$arrNull = array('normal_check_interval', 'retry_check_interval', 'max_check_attempts', 'low_flap_threshold',
'high_flap_threshold', 'freshness_threshold', 'notification_interval', 'first_notification_delay',
'check_interval', 'retry_interval');
if (in_array($key, $arrNull, true) && ($value === '')) {
$value = 'NULL';
}
/* manually set some NULL values based on table name */
if (($strTableName === 'tbl_serviceextinfo') && ($key === 'service_description')) {
$value = '0';
}
/* Do not copy the password in tbl_user */
if (($strTableName === 'tbl_user') && ($key === 'password')) {
$value = 'xxxxxxx';
}
/* Do not copy nodelete and webserver authentification values in tbl_user */
if ($key === 'nodelete') {
$value = '0';
}
if ($key === 'wsauth') {
$value = '0';
}
return $value;
}
/**
* Returns an array of all datafields of a table, which has an 1:1 or 1:n relation
* to another table.
* @param string $strTable Table name
* @param array|null $arrRelations Array with relations
* @return int 0 = successful / 1 = error
*/
public function tableRelations(string $strTable, array &$arrRelations = null): int
{
/* Define variable */
$arrRelations = array();
$arrData = array();
$intDC = 0;
$intReturn = 1;
/* Get relation data */
$strSQL = "SELECT * FROM `tbl_relationinformation` WHERE `master`='$strTable' AND `fullRelation`=0";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booReturn && ($intDC !== 0)) {
foreach ($arrData as $elem) {
$arrRelations[] = array('tableName1' => $elem['tableName1'], 'tableName2' => $elem['tableName2'],
'fieldName' => $elem['fieldName'], 'linkTable' => $elem['linkTable'],
'target1' => $elem['target1'], 'target2' => $elem['target2'],
'type' => $elem['type']);
}
$intReturn = 0;
}
return $intReturn;
}
/**
* Insert a normal 1:n relation
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param array $elem Link table information
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationType2(array $arrData, int $intID, array $elem, int $intMasterId, int $intCheck): int
{
$arrRelData = array();
$intRelDataCount = 0;
if ((int)$arrData[$intID][$elem['fieldName']] !== 0) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `idSlave`, `exclude` FROM `' . $elem['linkTable'] . '` ' .
'WHERE `idMaster`=' . $arrData[$intID]['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
if ($booReturn && ($intRelDataCount !== 0)) {
foreach ($arrRelData as $elem2) {
/** @noinspection SqlResolve */
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
"SET `idMaster`=$intMasterId, `idSlave`=" . $elem2['idSlave'] . ', ' .
'`exclude`=' . $elem2['exclude'];
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation for templates
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param array $elem Link table information
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationType3(array $arrData, int $intID, array $elem, int $intMasterId, int $intCheck): int
{
$arrRelData = array();
$intRelDataCount = 0;
if ((int)$arrData[$intID][$elem['fieldName']] === 1) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `idSlave`,`idSort`,`idTable` FROM `' . $elem['linkTable'] . '` ' .
'WHERE `idMaster`=' . $arrData[$intID]['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
if ($booReturn && ($intRelDataCount !== 0)) {
foreach ($arrRelData as $elem2) {
/** @noinspection SqlResolve */
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
"SET `idMaster`=$intMasterId, `idSlave`=" . $elem2['idSlave'] . ', ' .
'`idTable`=' . $elem2['idTable'] . ', `idSort`=' . $elem2['idSort'];
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
}
return $intCheck;
}
/**
* Insert a special relation for free variables
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param array $elem Link table information
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationType4(array $arrData, int $intID, array $elem, int $intMasterId, int $intCheck): int
{
$arrRelData = array();
$arrDataVar = array();
$intRelDataCount = 0;
$intDCVar = 0;
if ((int)$arrData[$intID][$elem['fieldName']] !== 0) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `idSlave` FROM `' . $elem['linkTable'] . '` ' .
'WHERE `idMaster` = ' . $arrData[$intID]['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
if ($booReturn && ($intRelDataCount !== 0)) {
foreach ($arrRelData as $elem2) {
/* Copy variables and link them to the new master */
$strSQLVar = 'SELECT * FROM `tbl_variabledefinition` WHERE `id`=' . $elem2['idSlave'];
$booReturn = $this->myDBClass->hasDataArray($strSQLVar, $arrDataVar, $intDCVar);
if ($booReturn && ($intDCVar !== 0)) {
$strSQLInsVar = 'INSERT INTO `tbl_variabledefinition` ' .
"SET `name`='" . addslashes($arrDataVar[0]['name']) . "', " .
"`value`='" . addslashes($arrDataVar[0]['value']) . "', " .
'`last_modified`=NOW()';
$booReturn = $this->myDBClass->insertData($strSQLInsVar);
if ($booReturn === false) {
$intCheck++;
}
/** @noinspection SqlResolve */
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
"SET `idMaster`=$intMasterId, " .
'`idSlave`=' . $this->myDBClass->intLastId;
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation for tbl_lnkServicegroupToService
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param array $elem Link table information
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationType5(array $arrData, int $intID, array $elem, int $intMasterId, int $intCheck): int
{
$arrRelData = array();
$intRelDataCount = 0;
if ((int)$arrData[$intID][$elem['fieldName']] !== 0) {
$strSQL = 'SELECT `idSlaveH`,`idSlaveHG`,`idSlaveS`,`exclude` ' .
'FROM `' . $elem['linkTable'] . '` WHERE `idMaster`=' . $arrData[$intID]['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
if ($booReturn && ($intRelDataCount !== 0)) {
foreach ($arrRelData as $elem2) {
/** @noinspection SqlResolve */
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
"SET `idMaster`=$intMasterId, `idSlaveH`=" . $elem2['idSlaveH'] . ', ' .
'`idSlaveHG`=' . $elem2['idSlaveHG'] . ', `idSlaveS`=' . $elem2['idSlaveS'] . ', `exclude`=' .
$elem2['exclude'];
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation for services
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param array $elem Link table information
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationType6(array $arrData, int $intID, array $elem, int $intMasterId, int $intCheck): int
{
$arrRelData = array();
$intRelDataCount = 0;
if ((int)$arrData[$intID][$elem['fieldName']] !== 0) {
$strSQL = 'SELECT `idSlave`, `strSlave`, `exclude` ' .
'FROM `' . $elem['linkTable'] . '` WHERE `idMaster`=' . $arrData[$intID]['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
if ($booReturn && ($intRelDataCount !== 0)) {
foreach ($arrRelData as $elem2) {
/** @noinspection SqlResolve */
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
"SET `idMaster`=$intMasterId, `idSlave`=" . $elem2['idSlave'] . ', ' .
"`strSlave`='" . addslashes($elem2['strSlave']) . "', " .
'`exclude`=' . $elem2['exclude'];
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation for time definitions
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationTimedefinition(array $arrData, int $intID, int $intMasterId, int $intCheck): int
{
$arrRelDataTP = array();
$intRelDataCountTP = 0;
$strSQL = 'SELECT * FROM `tbl_timedefinition` WHERE `tipId`=' . $arrData[$intID]['id'];
$this->myDBClass->hasDataArray($strSQL, $arrRelDataTP, $intRelDataCountTP);
if ($intRelDataCountTP !== 0) {
foreach ($arrRelDataTP as $elem) {
$strSQLRel = 'INSERT INTO `tbl_timedefinition` (`tipId`,`definition`,`range`,' .
"`last_modified`) VALUES ($intMasterId,'" . addslashes($elem['definition']) . "'," .
"'" . addslashes($elem['range']) . "',now())";
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation for user groups
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationGroup(array $arrData, int $intID, int $intMasterId, int $intCheck): int
{
$arrRelDataTP = array();
$intRelDataCountTP = 0;
$strSQL = 'SELECT * FROM `tbl_lnkGroupToUser` WHERE `idMaster`=' . $arrData[$intID]['id'];
$this->myDBClass->hasDataArray($strSQL, $arrRelDataTP, $intRelDataCountTP);
if ($intRelDataCountTP !== 0) {
foreach ($arrRelDataTP as $elem2) {
$strSQLRel = 'INSERT INTO `tbl_lnkGroupToUser` (`idMaster`,`idSlave`,`read`,`write`,`link`) ' .
"VALUES ($intMasterId,'" . $elem2['idSlave'] . "','" . $elem2['read'] . "'," .
"'" . $elem2['write'] . "','" . $elem2['link'] . "')";
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
return $intCheck;
}
/**
* Insert a 1:n relation fot service to host connections
* @param array $arrData Database value array
* @param integer $intID Database array key
* @param integer $intMasterId Data ID of master table
* @param integer $intCheck Check error counter (before processing)
* @return integer Check error counter (after processing)
*/
private function insertRelationHost(array $arrData, int $intID, int $intMasterId, int $intCheck): int
{
$arrRelDataSH = array();
$intRelDataCountSH = 0;
$strSQL = 'SELECT * FROM `tbl_lnkServiceToHost` WHERE `idSlave`=' . $arrData[$intID]['id'];
$this->myDBClass->hasDataArray($strSQL, $arrRelDataSH, $intRelDataCountSH);
if ($intRelDataCountSH !== 0) {
foreach ($arrRelDataSH as $elem2) {
$strSQLRel = 'INSERT INTO `tbl_lnkServiceToHost` (`idMaster`,`idSlave`,`exclude`) ' .
"VALUES ('" . $elem2['idMaster'] . "',$intMasterId,'" . $elem2['exclude'] . "')";
$booReturn = $this->myDBClass->insertData($strSQLRel);
if ($booReturn === false) {
$intCheck++;
}
}
}
return $intCheck;
}
/**
* Saving a given string to the logbook
* @param string $strLogMessage Message string
* @return int 0 = successful / 1 = error
*/
public function writeLog(string $strLogMessage): int
{
/* Variable definition */
$strRemoteAdress = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
$intReturn = 0;
/* Write log message to database */
if ($strRemoteAdress !== null) {
/* Webinterface */
$strUserName = $this->strUserName;
$strDomain = $this->myDBClass->getFieldData('SELECT `domain` FROM `tbl_datadomain` ' .
'WHERE `id`=' . $this->intDomainId);
$booReturn = $this->myDBClass->insertData("INSERT INTO `tbl_logbook` SET `user`='" . $strUserName . "'," .
"`time`=NOW(), `ipadress`='" . $strRemoteAdress . "', `domain`='$strDomain'," .
"`entry`='" . addslashes($strLogMessage) . "'");
} else {
/* Scriptinginterface */
$strUserName = 'scripting';
$strRemoteUser = filter_input(INPUT_SERVER, 'REMOTE_USER', FILTER_UNSAFE_RAW);
$strHostname = filter_input(INPUT_SERVER, 'REMOTE_HOST', FILTER_UNSAFE_RAW);
$strSSHClient = filter_input(INPUT_SERVER, 'SSH_CLIENT', FILTER_UNSAFE_RAW);
if ($strRemoteUser !== null) {
$strUserName .= ' - ' . $strRemoteUser;
}
$strDomain = $this->myDBClass->getFieldData('SELECT `domain` FROM `tbl_datadomain` ' .
'WHERE `id`=' . $this->intDomainId);
if ($strHostname !== null) {
$booReturn = $this->myDBClass->insertData("INSERT INTO `tbl_logbook` SET `user`='" . $strUserName . "'," .
"`time`=NOW(), `ipadress`='" . $strHostname . "', `domain`='$strDomain', " .
"`entry`='" . addslashes($strLogMessage) . "'");
} elseif ($strSSHClient !== null) {
$arrSSHClient = explode(' ', $strSSHClient);
$booReturn = $this->myDBClass->insertData("INSERT INTO `tbl_logbook` SET `user`='" . $strUserName . "'," .
"`time`=NOW(), `ipadress`='" . $arrSSHClient[0] . "', `domain`='$strDomain', " .
"`entry`='" . addslashes($strLogMessage) . "'");
} else {
$booReturn = $this->myDBClass->insertData("INSERT INTO `tbl_logbook` SET `user`='" . $strUserName . "'," .
"`time`=NOW(), `ipadress`='unknown', `domain`='$strDomain', " .
"`entry`='" . addslashes($strLogMessage) . "'");
}
}
if ($booReturn === false) {
$intReturn = 1;
}
return $intReturn;
}
/**
* Update the date inside the status table (used for last modified date)
* @param string $strTable Table name
* @return int 0 = successful / 1 = error
*/
public function updateStatusTable(string $strTable): int
{
/* Define variable */
$arrData = array();
$intDC = 0;
$intReturn = 1;
/* Does the entry exist? */
$strSQL = "SELECT * FROM `tbl_tablestatus` WHERE `tableName`='$strTable' AND `domainId`=" . $this->intDomainId;
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booReturn && ($intDC !== 0)) {
$strSQL = 'UPDATE `tbl_tablestatus` SET `updateTime`=NOW() ' .
"WHERE `tableName`='$strTable' AND `domainId`=" . $this->intDomainId;
$booReturn = $this->dataInsert($strSQL, $intDataID);
if ($booReturn) {
$intReturn = 0;
}
} elseif ($booReturn) {
$strSQL = 'INSERT INTO `tbl_tablestatus` ' .
"SET `updateTime`=NOW(), `tableName`='$strTable', `domainId`=" . $this->intDomainId;
$booReturn = $this->dataInsert($strSQL, $intDataID);
if ($booReturn) {
$intReturn = 0;
}
}
return $intReturn;
}
/**
* PRIVATE functions
*/
/**
* Sends an SQL string to the database server
* @param string $strSQL SQL Command
* @param int|null $intDataID Data ID of last inserted dataset (by reference)
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataInsert(string $strSQL, int &$intDataID = null): int
{
/* Define variables */
$intReturn = 0;
/* Send the SQL command to the database server */
$booReturn = $this->myDBClass->insertData($strSQL);
$intDataID = $this->myDBClass->intLastId;
/* Was the SQL command processed successfully? */
if ($booReturn) {
$this->processClassMessage(translate('Data were successfully inserted to the data base!') .
'::', $this->strInfoMessage);
} else {
$this->processClassMessage(translate('Error while inserting the data into the database:') .
'::' . $this->myDBClass->strErrorMessage . '::', $this->strErrorMessage);
$intReturn = 1;
}
return $intReturn;
}
/**
* Removes one or more dataset(s) from a table. Optinal a single data ID can be passed or the values will be
* processed through the POST variable $_POST['chbId_n'] where 'n' represents the data ID.
* -> This function does not delete any relation data! <-
* @param string $strTableName Table name
* @param int $intDataId Single data ID
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataDeleteEasy(string $strTableName, int $intDataId = 0): int
{
/* Define variables */
$strNoDelete1 = '';
$strNoDelete2 = '';
$intReturn = 0;
$arrData = array();
/* Special rule for tables with "nodelete" cells */
if (($strTableName === 'tbl_datadomain') || ($strTableName === 'tbl_configtarget') ||
($strTableName === 'tbl_user')) {
$strNoDelete1 = "AND `nodelete` <> '1'";
$strNoDelete2 = "WHERE `nodelete` <> '1'";
}
/* Delete a single data set */
if ($intDataId !== 0) {
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $strTableName . "` WHERE `id` = $intDataId $strNoDelete1";
$booReturn = $this->myDBClass->insertData($strSQL);
if ($booReturn === false) {
$this->processClassMessage(translate('Delete failed because a database error:') .
'::' . $this->myDBClass->strErrorMessage . '::', $this->strInfoMessage);
$intReturn = 1;
} elseif ($this->myDBClass->intAffectedRows === 0) {
$this->processClassMessage(translate('No data deleted. The dataset probably does not exist or ' .
'is protected from deletion.') . '::', $this->strErrorMessage);
$intReturn = 1;
} else {
$this->strInfoMessage .= translate('Dataset successfully deleted. Affected rows:') . ' ' .
$this->myDBClass->intAffectedRows . '::';
$this->writeLog(translate('Delete dataset id:') . " $intDataId " . translate('- from table:') .
" $strTableName " . translate('- with affected rows:') . ' ' . $this->myDBClass->intAffectedRows);
$this->updateStatusTable($strTableName);
}
/* Delete data sets based on form POST parameter */
} else {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ';
$strSQL .= $strNoDelete2;
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
$intDeleteCount = 0;
foreach ($arrData as $elem) {
$strChbName = 'chbId_' . $elem['id'];
/* Should this data id to be deleted? */
if ((filter_input(INPUT_POST, $strChbName) !== null) &&
(filter_input(INPUT_POST, $strChbName, FILTER_UNSAFE_RAW) === 'on')) {
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $strTableName . '` WHERE `id` = ' . $elem['id'];
$booReturn = $this->myDBClass->insertData($strSQL);
if ($booReturn === false) {
$this->processClassMessage(translate('Delete failed because a database error:') .
'::' . $this->myDBClass->strErrorMessage . '::', $this->strInfoMessage);
$intReturn = 1;
} else {
$intDeleteCount += $this->myDBClass->intAffectedRows;
}
}
}
/* Process messsages */
if ($intDeleteCount === 0) {
$this->processClassMessage(translate('No data deleted. Probably the dataset does not exist or ' .
'it is protected from delete.') . '::', $this->strErrorMessage);
$intReturn = 1;
} elseif ($intReturn === 0) {
$this->processClassMessage(translate('Dataset successfully deleted. Affected rows:') . ' ' .
$intDeleteCount . '::', $this->strInfoMessage);
$this->writeLog(translate('Deleted data from table:') . " $strTableName " .
translate('- with affected rows:') . ' ' . $this->myDBClass->intAffectedRows);
$this->updateStatusTable($strTableName);
}
} else {
$this->processClassMessage(translate('No data deleted. Probably the dataset does not exist or it is ' .
'protected from delete.') . '::', $this->strErrorMessage);
$intReturn = 1;
}
}
return $intReturn;
}
/**
* Removes one or more dataset(s) from a table. Optinal a single data ID can be passed or the values will be
* processed through the POST variable $_POST['chbId_n'] where 'n' represents the data ID.
* -> This function does also delete relation data! <-
* @param string $strTableName Table name
* @param int $intDataId Single data ID
* @param int $intForce Force deletion (1 = force, 1 = no force)
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataDeleteFull(string $strTableName, int $intDataId = 0, int $intForce = 0): int
{
/* Define variables */
$arrRelations = array();
$arrData = array();
$arrConfigId = array();
/* Get write access groups */
$strAccess = $this->myVisClass->getAccessGroups('write');
/* Get all relations */
$this->fullTableRelations($strTableName, $arrRelations);
/* Get all datasets */
if ($strTableName === 'tbl_group') {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '`';
} else {
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ' .
'WHERE `config_id`=' . $this->intDomainId . " AND `access_group` IN ($strAccess)";
}
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
$intDeleteCount = 0;
$strInfoMessage = '';
$strErrorMessage = '';
foreach ($arrData as $elem) {
$strChbName = 'chbId_' . $elem['id'];
/* Single ID */
if (($intDataId !== 0) && ($intDataId !== (int)$elem['id'])) {
continue;
}
/* Should this data id to be deleted? */
if ((($intDataId === (int)$elem['id']) || ((filter_input(INPUT_POST, $strChbName) !== null) &&
(filter_input(INPUT_POST, $strChbName, FILTER_UNSAFE_RAW) === 'on'))) &&
(($this->infoRelation($strTableName, $elem['id'], 'id', 1) === 0) || ($intForce === 1))) {
/* Delete relations */
if (!is_array($arrRelations)) {
$arrRelations = array();
}
foreach ($arrRelations as $rel) {
$strSQL = '';
/* Process flags */
$arrFlags = explode(',', $rel['flags']);
/* Simple 1:n relation */
if ((int)$arrFlags[3] === 1) {
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $rel['tableName1'] . '` ' .
'WHERE `' . $rel['fieldName'] . '`=' . $elem['id'];
}
/* Simple 1:1 relation */
if ((int)$arrFlags[3] === 0) {
/* Delete relation */
if ((int)$arrFlags[2] === 0) {
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $rel['tableName1'] . '` ' .
'WHERE `' . $rel['fieldName'] . '`=' . $elem['id'];
/* Set slave to 0 */
} elseif ((int)$arrFlags[2] === 2) {
$strSQL = 'UPDATE `' . $rel['tableName1'] . '` SET `' . $rel['fieldName'] . '`=0 ' .
'WHERE `' . $rel['fieldName'] . '`=' . $elem['id'];
}
}
/* Special 1:n relation for variables */
if ((int)$arrFlags[3] === 2) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $rel['tableName1'] . '` WHERE `idMaster`=' . $elem['id'];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
foreach ($arrData as $vardata) {
$strSQL = 'DELETE FROM `tbl_variabledefinition` ' .
'WHERE `id`=' . $vardata['idSlave'];
$this->myDBClass->insertData($strSQL);
}
}
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $rel['tableName1'] . '` WHERE `idMaster`=' . $elem['id'];
}
/* Special 1:n relation for time definitions */
if ((int)$arrFlags[3] === 3) {
$strSQL = 'DELETE FROM `tbl_timedefinition` WHERE `tipId`=' . $elem['id'];
$this->myDBClass->insertData($strSQL);
}
if ($strSQL !== '') {
$this->myDBClass->insertData($strSQL);
}
}
/* Delete host configuration file */
if (($strTableName === 'tbl_host') && ($this->intDomainId !== 0)) {
$strSQL = 'SELECT `host_name` FROM `tbl_host` WHERE `id`=' . $elem['id'];
$strHost = $this->myDBClass->getFieldData($strSQL);
$intRetConf = $this->myConfigClass->getConfigSets($arrConfigId);
if ($intRetConf !== 1) {
$intReturn = 0;
foreach ($arrConfigId as $intConfigId) {
$intReturn += $this->myConfigClass->moveFile(
'host',
$strHost . '.cfg',
$intConfigId
);
}
if ($intReturn === 0) {
$this->processClassMessage(translate('The assigned, no longer used configuration ' .
'files were deleted successfully!') . '::', $strInfoMessage);
$this->writeLog(translate('Host file deleted:') . ' ' . $strHost . '.cfg');
} else {
$strErrorMessage .= translate('Errors while deleting the old configuration file - ' .
'please check!:') . ' ::' . $this->myConfigClass->strErrorMessage . '::';
}
}
}
/* Delete service configuration file */
if (($strTableName === 'tbl_service') && ($this->intDomainId !== 0)) {
$strSQL = 'SELECT `config_name` FROM `tbl_service` WHERE `id`=' . $elem['id'];
$strService = $this->myDBClass->getFieldData($strSQL);
$strSQL = "SELECT * FROM `tbl_service` WHERE `config_name` = '$strService'";
$this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($intDataCount === 1) {
$intRetConf = $this->myConfigClass->getConfigSets($arrConfigId);
if ($intRetConf !== 1) {
$intReturn = 0;
foreach ($arrConfigId as $intConfigId) {
$intReturn += $this->myConfigClass->moveFile(
'service',
$strService . '.cfg',
$intConfigId
);
}
if ($intReturn === 0) {
$this->processClassMessage(translate('The assigned, no longer used ' .
'configuration files were deleted successfully!') .
'::', $strInfoMessage);
$this->writeLog(translate('Host file deleted:') . ' ' . $strService . '.cfg');
} else {
$strErrorMessage .= translate('Errors while deleting the old configuration ' .
'file - please check!:') . '::' .
$this->myConfigClass->strErrorMessage . '::';
}
}
}
}
/* Delete main entry */
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $strTableName . '` WHERE `id`=' . $elem['id'];
$this->myDBClass->insertData($strSQL);
$intDeleteCount++;
}
}
/* Process messages */
if ($intDeleteCount === 0) {
$this->processClassMessage(translate('No data deleted. Probably the dataset does not exist, it is ' .
'protected from deletion, you do not have write permission or it has relations to other ' .
'configurations which cannot be deleted. Use the "info" function for detailed informations ' .
'about relations!') . '::', $this->strErrorMessage);
return 1;
}
$this->updateStatusTable($strTableName);
$this->processClassMessage(translate('Dataset successfully deleted. Affected rows:') . ' ' .
$intDeleteCount . '::', $this->strInfoMessage);
$this->writeLog(translate('Deleted data from table:') . " $strTableName " .
translate('- with affected rows:') . ' ' . $intDeleteCount);
$this->processClassMessage($strInfoMessage, $this->strInfoMessage);
$this->processClassMessage($strErrorMessage, $this->strErrorMessage);
return 0;
}
$this->processClassMessage(translate('No data deleted. Probably the dataset does not exist, it is ' .
'protected from deletion or you do not have write permission.') . '::' .
$this->myDBClass->strErrorMessage, $this->strErrorMessage);
return 1;
}
/**
* Returns an array with any data fields from a table with existing relations to another table. This function
* returns also passive relations which are not used in configurations.
* This function is used for a full deletion of a configuration entry or to find out if a configuration is used
* in another way.
* @param string $strTable Table name
* @param array|null $arrRelations Array with relations
* @return int 0 = no field with relation / 1 = at least one field with relation
* Status message is stored in message class variables
* Data array: tableName Table include the relation data
* fieldName Field name include the relation data
* flags Pos 1 -> 0=Normal field / 1=Required field (field type)
* Pos 2 -> 0=delete / 1=keep data / 2=set to 0 (normal deletion option)
* Pos 3 -> 0=delete / 2=set to 0 (force deletion option)
* Pos 4 -> 0=1:1 / 1=1:n / (relation type)
* 2=1:n (variables) / 3=1:n (timedef)
*/
public function fullTableRelations(string $strTable, array &$arrRelations = null): int
{
/* Define variable */
$arrRelations = array();
$arrData = array();
$intDC = 0;
$intReturn = 0;
/* Get relation data */
$strSQL = "SELECT * FROM `tbl_relationinformation` WHERE `master`='$strTable' AND `fullRelation`=1";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booReturn && ($intDC !== 0)) {
foreach ($arrData as $elem) {
$arrRelations[] = array('tableName1' => $elem['tableName1'], 'fieldName' => $elem['fieldName'],
'target1' => $elem['target1'], 'targetKey' => $elem['targetKey'],
'flags' => $elem['flags']);
}
$intReturn = 1;
}
return $intReturn;
}
/**
* Searches any relation in the database and returns them as relation information
* @param string $strTable Database table name
* @param int $intMasterId Data ID from master table
* @param string $strMasterfield Info field name from master table
* @param int $intReporting Output as text - 0=yes, 1=no
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function infoRelation(string $strTable, int $intMasterId, string $strMasterfield, int $intReporting = 0): int
{
$intDeletion = 0;
$arrDSCount = array();
$arrRelations = array();
$arrData = array();
$arrDataCheck = array();
$intReturn = $this->fullTableRelations($strTable, $arrRelations);
if (($intReturn === 1) && ($intMasterId !== 0)) {
/* Get master field data */
$strNewMasterfield = str_replace(',', '`,`', $strMasterfield);
$strSQL = 'SELECT `' . $strNewMasterfield . '` FROM `' . $strTable . "` WHERE `id` = $intMasterId";
$this->myDBClass->hasSingleDataset($strSQL, $arrSource);
if (substr_count($strMasterfield, ',') !== 0) {
$arrTarget = explode(',', $strMasterfield);
$strName = $arrSource[$arrTarget[0]] . '-' . $arrSource[$arrTarget[1]];
} else {
$strName = $arrSource[$strMasterfield];
}
$this->strInfoMessage .= '<span class="blackmessage">' . translate('Relation information for <b>') .
$strName . translate('</b> of table <b>') . $strTable . ':</b></span>::';
$this->strInfoMessage .= '<span class="bluemessage">';
/* Walk through relations */
foreach ($arrRelations as $elem) {
/* Process flags */
$arrFlags = explode(',', $elem['flags']);
if ($elem['fieldName'] === 'check_command') {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $elem['tableName1'] . '` ' .
'WHERE SUBSTRING_INDEX(`' . $elem['fieldName'] . "`,'!',1)= $intMasterId";
} else {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $elem['tableName1'] . '` WHERE `' . $elem['fieldName'] . "`= $intMasterId";
}
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
/* Take only used relations */
if ($booReturn && ($intDataCount !== 0)) {
/* Relation type */
if ((int)$arrFlags[3] === 1) {
foreach ($arrData as $data) {
if ($elem['fieldName'] === 'idMaster') {
$strRef = 'idSlave';
/* Process special tables */
if ($elem['target1'] === 'tbl_service') {
if ($elem['tableName1'] === 'tbl_lnkServicegroupToService') {
$strRef = 'idSlaveS';
}
} elseif ($elem['target1'] === 'tbl_host') {
if ($elem['tableName1'] === 'tbl_lnkServicegroupToService') {
$strRef = 'idSlaveH';
}
} elseif ($elem['target1'] === 'tbl_hostgroup') {
if ($elem['tableName1'] === 'tbl_lnkServicegroupToService') {
$strRef = 'idSlaveHG';
}
}
} else {
$strRef = 'idMaster';
}
/* Get data */
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $elem['tableName1'] . '` ' .
'LEFT JOIN `' . $elem['target1'] . '` ON `' . $strRef . '` = `id` ' .
'WHERE `' . $elem['fieldName'] . '` = ' . $data[$elem['fieldName']] . ' ' .
'AND `' . $strRef . '`=' . $data[$strRef];
$this->myDBClass->hasSingleDataset($strSQL, $arrDSTarget);
if (substr_count($elem['targetKey'], ',') !== 0) {
$arrTarget = explode(',', $elem['targetKey']);
$strTarget = $arrDSTarget[$arrTarget[0]] . '-' . $arrDSTarget[$arrTarget[1]];
} else {
$strTarget = $arrDSTarget[$elem['targetKey']];
}
/* If the field is market as "required", check for any other entries */
if ((int)$arrFlags[0] === 1) {
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $elem['tableName1'] . '` ' .
'WHERE `' . $strRef . '` = ' . $arrDSTarget[$strRef];
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDSCount, $intDCCount);
if ($booReturn && ($intDCCount > 1)) {
$this->strInfoMessage .= translate('Relation to <b>') . $elem['target1'] .
translate('</b>, entry <b>') . $strTarget .
'</b> - <span style="color:#00CC00;">' . translate('deletion <b>possible</b>') .
'</span>::';
} else {
$this->strInfoMessage .= translate('Relation to <b>') . $elem['target1'] .
translate('</b>, entry <b>') . $strTarget .
'</b> - <span style="color:#FF0000;">' .
translate('deletion <b>not possible</b>') . '</span>::';
$intDeletion = 1;
}
} else {
$this->strInfoMessage .= translate('Relation to <b>') . $elem['target1'] .
translate('</b>, entry <b>') . $strTarget . '</b> - <span style="color:#00CC00;">' .
translate('deletion <b>possible</b>') . '</span>::';
}
}
} elseif ((int)$arrFlags[3] === 0) {
/* Fetch remote entry */
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $elem['tableName1'] . '` '
. 'WHERE `' . $elem['fieldName'] . "`=$intMasterId";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataCheck, $intDCCheck);
if ($booReturn && ($intDCCheck !== 0)) {
foreach ($arrDataCheck as $data) {
if (substr_count($elem['targetKey'], ',') !== 0) {
$arrTarget = explode(',', $elem['targetKey']);
$strTarget = $data[$arrTarget[0]] . '-' . $data[$arrTarget[1]];
} else {
$strTarget = $data[$elem['targetKey']];
}
if ((int)$arrFlags[0] === 1) {
$this->strInfoMessage .= translate('Relation to <b>') . $elem['tableName1'] .
translate('</b>, entry <b>') . $strTarget .
'</b> - <span style="color:#FF0000;">' .
translate('deletion <b>not possible</b>') . '</span>::';
$intDeletion = 1;
} else {
$this->strInfoMessage .= translate('Relation to <b>') . $elem['tableName1'] .
translate('</b>, entry <b>') . $strTarget .
'</b> - <span style="color:#00CC00;">' .
translate('deletion <b>possible</b>') . '</span>::';
}
}
}
}
}
}
$this->strInfoMessage .= '</span>::';
}
if ($intReporting === 1) {
$this->strInfoMessage = '';
}
return $intDeletion;
}
/**
* Update the datasets for 1:n (optional 1:n:m) relations in the database table
* @param string $strTable Database table name
* @param int $intMasterId Data ID from master table
* @param array $arrSlaveId Array with all data IDs from slave table
* @param int $intMulti 0 = for 1:n relations
* 1 = for 1:n:n relations
* @return int 0 = successful / 1 = error
*/
public function dataUpdateRelation(string $strTable, int $intMasterId, array $arrSlaveId, int $intMulti = 0): int
{
$intReturn = 0;
/* Remove any old relations */
$intReturn1 = $this->dataDeleteRelation($strTable, $intMasterId);
if ($intReturn1 !== 0) {
$intReturn = 1;
}
/* Insert the new relations */
if ($intReturn === 0) {
$intReturn2 = $this->dataInsertRelation($strTable, $intMasterId, $arrSlaveId, $intMulti);
if ($intReturn2 !== 0) {
$intReturn = 1;
}
}
return $intReturn;
}
/**
* Removes any relation from the database
* @param string $strTable Database table name
* @param int $intMasterId Data ID from master table
* @return int 0 = successful / 1 = error
*/
public function dataDeleteRelation(string $strTable, int $intMasterId): int
{
/* Define variables */
$intDataId = 0;
/* Define the SQL statement */
/** @noinspection SqlResolve */
$strSQL = 'DELETE FROM `' . $strTable . "` WHERE `idMaster`=$intMasterId";
return $this->dataInsert($strSQL, $intDataId);
}
/**
* Inserts any necessary dataset for an 1:n (optional 1:n:n) relation to the database table
* @param string $strTable Database table name
* @param int $intMasterId Data ID from master table
* @param array $arrSlaveId Array with all data IDs from slave table
* @param int $intMulti 0 = for 1:n relations
* 1 = for 1:n:n relations
* @return int 0 = successful / 1 = error
*/
public function dataInsertRelation(string $strTable, int $intMasterId, array $arrSlaveId, int $intMulti = 0): int
{
/* Define variables */
$intReturn = 0;
$intDataId = 0;
$strSQL = '';
/* Walk through the slave data ID array */
foreach ($arrSlaveId as $elem) {
/* Pass empty and '*' values */
if ($elem === '0') {
continue;
}
if ($elem === '*') {
continue;
}
/* Process exclude values */
if (0 === strpos($elem, 'e')) {
$elem = str_replace('e', '', $elem);
$intExclude = 1;
} else {
$intExclude = 0;
}
/* Define the SQL statement */
if ($intMulti !== 0) {
$arrValues = explode('::', $elem);
/** @noinspection SqlResolve */
$strSQL = 'INSERT INTO `' . $strTable . "` SET `idMaster`=$intMasterId, `idSlaveH`=" . $arrValues[0]
. ', `idSlaveHG`=' . $arrValues[1] . ', `idSlaveS`=' . $arrValues[2] . ", `exclude`=$intExclude";
} else if (($strTable === 'tbl_lnkServicedependencyToService_DS') ||
($strTable === 'tbl_lnkServicedependencyToService_S') ||
($strTable === 'tbl_lnkServiceescalationToService')) {
/* Get service description */
$strSQLSrv = "SELECT `service_description` FROM `tbl_service` WHERE id=$elem";
$strService = $this->myDBClass->getFieldData($strSQLSrv);
/** @noinspection SqlResolve */
$strSQL = 'INSERT INTO `' . $strTable . "` SET `idMaster`=$intMasterId, `idSlave`=$elem, " .
"`strSlave`='" . addslashes($strService) . "', `exclude`=$intExclude";
} elseif (($strTable === 'tbl_lnkServiceToService') ||
($strTable === 'tbl_lnkServicetemplateToService')) {
$arrValues = explode('-', $elem);
if (isset($arrValues[0], $arrValues[1])) {
/** @noinspection SqlResolve */
$strSQL = 'INSERT INTO `' . $strTable . "` SET `idMaster`=$intMasterId, `idSlave`=$arrValues[0], "
. " `idHost`=$arrValues[1]";
}
} elseif (($strTable !== 'tbl_lnkTimeperiodToTimeperiod') &&
($strTable !== 'tbl_lnkDatadomainToConfigtarget')) {
/** @noinspection SqlResolve */
$strSQL = 'INSERT INTO `' . $strTable . '` ' .
"SET `idMaster`=$intMasterId, `idSlave`=$elem, `exclude`=$intExclude";
} else {
/** @noinspection SqlResolve */
$strSQL = 'INSERT INTO `' . $strTable . "` SET `idMaster`=$intMasterId, `idSlave`=$elem";
}
/* Insert data */
$intReturn = $this->dataInsert($strSQL, $intDataId);
if ($intReturn !== 0) {
$intReturn = 1;
}
}
return $intReturn;
}
/**
* Deactivates one or many datasets in the table be setting 'active' to '0'. Alternatively, a single record
* ID can be specified or evaluated by the values of $_POST['chbId_n'] passed parameters, where n is the
* record ID must match.
* @param string $strTableName Table name
* @param int $intDataId Individual record ID, which is to be activated
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataDeactivate(string $strTableName, int $intDataId = 0): int
{
/* Define variables */
$intReturn = 1;
$arrData = array();
/* Get write access groups */
$strAccess = $this->myVisClass->getAccessGroups('write');
/* Activate datasets */
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ' .
'WHERE `config_id`=' . $this->intDomainId . " AND `access_group` IN ($strAccess)";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
$intActivateCount = 0;
foreach ($arrData as $elem) {
$strChbName = 'chbId_' . $elem['id'];
/* was the current record is marked for activate? */
if ((($intDataId === (int)$elem['id']) || ((filter_input(INPUT_POST, $strChbName) !== null) &&
(filter_input(INPUT_POST, $strChbName, FILTER_UNSAFE_RAW) === 'on'))) &&
$this->infoRelation($strTableName, $elem['id'], 'id', 1) === 0) {
/* Update dataset */
if (($strTableName === 'tbl_service') || ($strTableName === 'tbl_host')) {
$strSQL = 'UPDATE `' . $strTableName . "` SET `active`='0', `last_modified`=now() " .
'WHERE `id`=' . $elem['id'];
} else {
$strSQL = 'UPDATE `' . $strTableName . "` SET `active`='0' WHERE `id`=" . $elem['id'];
}
$this->myDBClass->insertData($strSQL);
$intActivateCount++;
}
}
/* Process information */
if ($intActivateCount === 0) {
$this->processClassMessage(translate('No dataset deactivated. Maybe the dataset does not exist, it ' .
'is protected from deactivation, no dataset was selected or you do not have write permission. ' .
'Use the "info" function for detailed informations about relations!') .
'::', $this->strErrorMessage);
} else {
$this->updateStatusTable($strTableName);
$this->processClassMessage(translate('Dataset successfully deactivated. Affected rows:') . ' ' .
$intActivateCount . '::', $this->strInfoMessage);
$this->writeLog(translate('Deactivate dataset from table:') . " $strTableName " .
translate('- with affected rows:') . ' ' . $this->myDBClass->intAffectedRows);
$intReturn = 0;
}
} else {
$this->processClassMessage(translate('No dataset deactivated. Maybe the dataset does not exist or you ' .
'do not have write permission.') . '::', $this->strErrorMessage);
}
return $intReturn;
}
/**
* Activates one or many datasets in the table be setting 'active' to '1'. Alternatively, a single record ID can
* be specified or evaluated by the values of $_POST['chbId_n'] passed parameters, where n is the record ID must
* match.
* @param string $strTableName Table name
* @param int $intDataId Individual record ID, which is to be activated
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function dataActivate(string $strTableName, int $intDataId = 0): int
{
/* Define variables */
$intReturn = 1;
$arrData = array();
/* Get write access groups */
$strAccess = $this->myVisClass->getAccessGroups('write');
/* Activate datasets */
/** @noinspection SqlResolve */
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ' .
'WHERE `config_id`=' . $this->intDomainId . " AND `access_group` IN ($strAccess)";
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
if ($booReturn && ($intDataCount !== 0)) {
$intActivateCount = 0;
foreach ($arrData as $elem) {
$strChbName = 'chbId_' . $elem['id'];
/* was the current record marked for activate? */
if (($intDataId === (int)$elem['id']) || ((filter_input(INPUT_POST, $strChbName) !== null) &&
(filter_input(INPUT_POST, $strChbName, FILTER_UNSAFE_RAW) === 'on'))) {
/* Update dataset */
if (($strTableName === 'tbl_service') || ($strTableName === 'tbl_host')) {
$strSQL = 'UPDATE `' . $strTableName . "` SET `active`='1', `last_modified`=now() " .
'WHERE `id`=' . $elem['id'];
} else {
$strSQL = 'UPDATE `' . $strTableName . "` SET `active`='1' WHERE `id`=" . $elem['id'];
}
$this->myDBClass->insertData($strSQL);
$intActivateCount++;
}
}
/* Process information */
if ($intActivateCount === 0) {
$this->processClassMessage(translate('No dataset activated. Maybe the dataset does not exist, no ' .
'dataset was selected or you do not have write permission.') . '::', $this->strErrorMessage);
} else {
$this->updateStatusTable($strTableName);
$this->processClassMessage(translate('Dataset successfully activated. Affected rows:') . ' ' .
$intActivateCount . '::', $this->strInfoMessage);
$this->writeLog(translate('Activate dataset from table:') . " $strTableName " .
translate('- with affected rows:') . ' ' . $this->myDBClass->intAffectedRows);
$intReturn = 0;
}
} else {
$this->processClassMessage(translate('No dataset activated. Maybe the dataset does not exist or you do ' .
'not have write permission.') . '::', $this->strErrorMessage);
}
return $intReturn;
}
/**
* Updates the hash field im some configuration objects
* @param string $strTable Table name
* @param int $intId Data ID
* @return int 0 = successful / 1 = error
* Status message is stored in message class variables
*/
public function updateHash(string $strTable, int $intId): int
{
/* Define variables */
$strRawString = '';
$arrData = array();
$intDC = 0;
$intDataID = 0;
/* Service table */
if ($strTable === 'tbl_service') {
/* Get any hosts and host_groups */
$strSQL = 'SELECT `host_name` AS `item_name` FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkServiceToHost` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION SELECT `hostgroup_name` AS `item_name` FROM `tbl_hostgroup` ' .
'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `idSlave`=`id` ' .
'WHERE `idMaster`=' . $intId . ' ORDER BY `item_name`';
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
foreach ($arrData as $elem) {
$strRawString .= $elem['item_name'] . ',';
}
}
$strSQL = 'SELECT * FROM `tbl_service` WHERE `id`=' . $intId;
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
if ($arrData[0]['service_description'] !== '') {
$strRawString .= $arrData[0]['service_description'] . ',';
}
if ($arrData[0]['display_name'] !== '') {
$strRawString .= $arrData[0]['display_name'] . ',';
}
if ($arrData[0]['check_command'] !== '') {
$arrField = explode('!', $arrData[0]['check_command']);
$strCommand = strstr($arrData[0]['check_command'], '!');
$strSQLRel = 'SELECT `command_name` FROM `tbl_command` WHERE `id`=' . $arrField[0];
$strName = $this->myDBClass->getFieldData($strSQLRel);
$strRawString .= $strName . $strCommand . ',';
}
}
}
if (($strTable === 'tbl_hostdependency') || ($strTable === 'tbl_servicedependency')) {
/* Get * values */
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $strTable . '` WHERE `id`=' . $intId;
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
if (isset($arrData[0]['dependent_host_name']) && ((int)$arrData[0]['dependent_host_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['dependent_hostgroup_name']) && ((int)$arrData[0]['dependent_hostgroup_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['host_name']) && ((int)$arrData[0]['host_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['hostgroup_name']) && ((int)$arrData[0]['hostgroup_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['dependent_service_description']) &&
((int)$arrData[0]['dependent_service_description'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['service_description']) && ((int)$arrData[0]['service_description'] === 2)) {
$strRawString .= 'any,';
}
}
if ($strTable === 'tbl_hostdependency') {
/* Get any hosts and host_groups */
$strSQL = 'SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkHostdependencyToHost_DH` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
"LEFT JOIN `tbl_lnkHostdependencyToHostgroup_DH` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkHostdependencyToHost_H` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
'LEFT JOIN `tbl_lnkHostdependencyToHostgroup_H` ON `idSlave`=`id` WHERE `idMaster`=' . $intId;
}
if ($strTable === 'tbl_servicedependency') {
/* Get any hosts and host_groups */
$strSQL = 'SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkServicedependencyToHost_DH` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
'LEFT JOIN `tbl_lnkServicedependencyToHostgroup_DH` ON `idSlave`=`id` ' .
"WHERE `idMaster`=$intId " .
'UNION ALL SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkServicedependencyToHost_H` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
'LEFT JOIN `tbl_lnkServicedependencyToHostgroup_H` ON `idSlave`=`id` ' .
"WHERE `idMaster`=$intId " .
'UNION ALL SELECT `strSlave` AS `item_name`, exclude ' .
"FROM `tbl_lnkServicedependencyToService_DS` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `strSlave` AS `item_name`, exclude ' .
"FROM `tbl_lnkServicedependencyToService_S` WHERE `idMaster`=$intId";
}
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
foreach ($arrData as $elem) {
if ((int)$elem['exclude'] === 0) {
$strRawString .= $elem['item_name'] . ',';
} else {
$strRawString .= 'not_' . $elem['item_name'] . ',';
}
}
$strRawString = substr($strRawString, 0, -1);
}
}
if (($strTable === 'tbl_hostescalation') || ($strTable === 'tbl_serviceescalation')) {
/* Get * values */
/** @noinspection SqlResolve */
$strSQL = 'SELECT * FROM `' . $strTable . '` WHERE `id`=' . $intId;
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
if (isset($arrData[0]['host_name']) && ((int)$arrData[0]['host_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['hostgroup_name']) && ((int)$arrData[0]['hostgroup_name'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['contacts']) && ((int)$arrData[0]['contacts'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['contact_groups']) && ((int)$arrData[0]['contact_groups'] === 2)) {
$strRawString .= 'any,';
}
if (isset($arrData[0]['service_description']) && ((int)$arrData[0]['service_description'] === 2)) {
$strRawString .= 'any,';
}
}
/* Get any hosts, host_groups, contacts and contact_groups */
if ($strTable === 'tbl_hostescalation') {
$strSQL = 'SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkHostescalationToHost` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
"LEFT JOIN `tbl_lnkHostescalationToHostgroup` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `contact_name` AS `item_name`, exclude FROM `tbl_contact` ' .
"LEFT JOIN `tbl_lnkHostescalationToContact` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `contactgroup_name` AS `item_name`, exclude FROM `tbl_contactgroup` ' .
"LEFT JOIN `tbl_lnkHostescalationToContactgroup` ON `idSlave`=`id` WHERE `idMaster`=$intId";
}
if ($strTable === 'tbl_serviceescalation') {
$strSQL = 'SELECT `host_name` AS `item_name`, exclude FROM `tbl_host` ' .
"LEFT JOIN `tbl_lnkServiceescalationToHost` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `hostgroup_name` AS `item_name`, exclude FROM `tbl_hostgroup` ' .
"LEFT JOIN `tbl_lnkServiceescalationToHostgroup` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `contact_name` AS `item_name`, exclude FROM `tbl_contact` ' .
"LEFT JOIN `tbl_lnkServiceescalationToContact` ON `idSlave`=`id` WHERE `idMaster`=$intId " .
'UNION ALL SELECT `contactgroup_name` AS `item_name`, exclude FROM `tbl_contactgroup` ' .
'LEFT JOIN `tbl_lnkServiceescalationToContactgroup` ON `idSlave`=`id` ' .
"WHERE `idMaster`=$intId " .
'UNION ALL SELECT `strSlave` AS `item_name`, exclude ' .
"FROM `tbl_lnkServiceescalationToService` WHERE `idMaster`=$intId";
}
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
foreach ($arrData as $elem) {
if ((int)$elem['exclude'] === 0) {
$strRawString .= $elem['item_name'] . ',';
} else {
$strRawString .= 'not_' . $elem['item_name'] . ',';
}
}
$strRawString = substr($strRawString, 0, -1);
}
}
if ($strTable === 'tbl_serviceextinfo') {
/* Get any hosts and host_groups */
$strSQL = 'SELECT `tbl_host`.`host_name` AS `item_name` FROM `tbl_host` ' .
'LEFT JOIN `tbl_serviceextinfo` ON `tbl_host`.`id`=`tbl_serviceextinfo`.`host_name` ' .
"WHERE `tbl_serviceextinfo`.`id`=$intId " .
'UNION SELECT `tbl_service`.`service_description` AS `item_name` FROM `tbl_service` ' .
'LEFT JOIN `tbl_serviceextinfo` ON ' .
'`tbl_service`.`id`=`tbl_serviceextinfo`.`service_description` ' .
"WHERE `tbl_serviceextinfo`.`id`=$intId ORDER BY `item_name`";
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
if ($booRet && ($intDC !== 0)) {
foreach ($arrData as $elem) {
$strRawString .= $elem['item_name'] . ',';
}
$strRawString = substr($strRawString, 0, -1);
}
}
/* Remove blanks */
while (substr_count($strRawString, ' ') !== 0) {
$strRawString = str_replace(' ', '', $strRawString);
}
/* Sort hash string */
$arrTemp = explode(',', $strRawString);
sort($arrTemp);
$strRawString = implode(',', $arrTemp);
/* Update has in database */
$strSQL = 'UPDATE `' . $strTable . "` SET `import_hash`='" . sha1($strRawString) . "' WHERE `id`='$intId'";
return $this->dataInsert($strSQL, $intDataID);
}
}