1601 lines
84 KiB
PHP
1601 lines
84 KiB
PHP
|
<?php
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// NagiosQL
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// (c) 2005-2018 by Martin Willisegger
|
||
|
//
|
||
|
// Project : NagiosQL
|
||
|
// Component : NagiosQL data processing class
|
||
|
// Website : https://sourceforge.net/projects/nagiosql/
|
||
|
// Website : https://sourceforge.net/projects/nagiosql/
|
||
|
// Version : 3.4.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;
|
||
|
|
||
|
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($arrSession)
|
||
|
{
|
||
|
if (isset($arrSession['domain'])) {
|
||
|
$this->intDomainId = $arrSession['domain'];
|
||
|
}
|
||
|
if (isset($arrSession['username'])) {
|
||
|
$this->strUserName = $arrSession['username'];
|
||
|
}
|
||
|
$this->arrSession = $arrSession;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Saving a given string to the logbook
|
||
|
* @param string $strLogMessage Message string
|
||
|
* @return int 0 = successful / 1 = error
|
||
|
*/
|
||
|
public function writeLog($strLogMessage)
|
||
|
{
|
||
|
// 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)."'");
|
||
|
if ($booReturn == false) {
|
||
|
$intReturn = 1;
|
||
|
}
|
||
|
} else {
|
||
|
// Scriptinginterface
|
||
|
$strUserName = 'scripting';
|
||
|
$strRemoteUser = filter_input(INPUT_SERVER, 'REMOTE_USER', FILTER_SANITIZE_STRING);
|
||
|
$strHostname = filter_input(INPUT_SERVER, 'REMOTE_HOST', FILTER_SANITIZE_STRING);
|
||
|
$strSSHClient = filter_input(INPUT_SERVER, 'SSH_CLIENT', FILTER_SANITIZE_STRING);
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sends an SQL string to the database server
|
||
|
* @param string $strSQL SQL Command
|
||
|
* @param int $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($strSQL, &$intDataID)
|
||
|
{
|
||
|
//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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Merge message strings and check for duplicate messages
|
||
|
* @param string $strNewMessage New message to add
|
||
|
* @param string $strOldMessage Modified message string (by reference)
|
||
|
*/
|
||
|
public function processClassMessage($strNewMessage, &$strOldMessage)
|
||
|
{
|
||
|
$strNewMessage = str_replace('::::', '::', $strNewMessage);
|
||
|
if (($strOldMessage != '') && ($strNewMessage != '')) {
|
||
|
if (substr_count($strOldMessage, $strNewMessage) == 0) {
|
||
|
$strOldMessage .= $strNewMessage;
|
||
|
}
|
||
|
} else {
|
||
|
$strOldMessage .= $strNewMessage;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTableName, $strKeyField, $intDataId = 0, $intDomainId = -1)
|
||
|
{
|
||
|
// 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 = '';
|
||
|
}
|
||
|
$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 ($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_SANITIZE_STRING) != null) && ($intDataId == 0)) ||
|
||
|
($intDataId == $arrData[$i]['id'])) {
|
||
|
// Get all data of this data ID
|
||
|
$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
|
||
|
$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 ($elem['type'] == '2') {
|
||
|
$intCheck = $this->insertRelationType2($arrData, $i, $elem, $intMasterId, $intCheck);
|
||
|
} elseif ($elem['type'] == '3') { // 1:n relation for templates
|
||
|
$intCheck = $this->insertRelationType3($arrData, $i, $elem, $intMasterId, $intCheck);
|
||
|
} elseif ($elem['type'] == '4') { // Special relation for free variables
|
||
|
$intCheck = $this->insertRelationType4($arrData, $i, $elem, $intMasterId, $intCheck);
|
||
|
} elseif ($elem['type'] == '5') { // 1:n relation for tbl_lnkServicegroupToService
|
||
|
$intCheck = $this->insertRelationType5($arrData, $i, $elem, $intMasterId, $intCheck);
|
||
|
} elseif ($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 fot 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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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 $arrRelations Array with relations
|
||
|
* @return int 0 = successful / 1 = error
|
||
|
*/
|
||
|
public function tableRelations($strTable, &$arrRelations)
|
||
|
{
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTable)
|
||
|
{
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTableName, $intDataId = 0)
|
||
|
{
|
||
|
// Define variables
|
||
|
$strNoDelete = '';
|
||
|
$intReturn = 0;
|
||
|
$arrData = array();
|
||
|
// Special rule for tables with "nodelete" cells
|
||
|
if (($strTableName == 'tbl_datadomain') || ($strTableName == 'tbl_configtarget') ||
|
||
|
($strTableName == 'tbl_user')) {
|
||
|
$strNoDelete = "AND `nodelete` <> '1'";
|
||
|
}
|
||
|
// Delete a single data set
|
||
|
if ($intDataId != 0) {
|
||
|
$strSQL = 'DELETE FROM `' .$strTableName."` WHERE `id` = $intDataId $strNoDelete";
|
||
|
$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 {
|
||
|
$strSQL = 'SELECT `id` FROM `' .$strTableName. '` WHERE 1=1 ';
|
||
|
$strSQL .= $strNoDelete;
|
||
|
$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_SANITIZE_STRING) == 'on')) {
|
||
|
$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($strTableName, $intDataId = 0, $intForce = 0)
|
||
|
{
|
||
|
// 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') {
|
||
|
$strSQL = 'SELECT `id` FROM `' .$strTableName. '`';
|
||
|
} else {
|
||
|
$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 != $elem['id'])) {
|
||
|
continue;
|
||
|
}
|
||
|
// Should this data id to be deleted?
|
||
|
if ((($intDataId == $elem['id']) || ((filter_input(INPUT_POST, $strChbName) != null) &&
|
||
|
(filter_input(INPUT_POST, $strChbName, FILTER_SANITIZE_STRING) == '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 ($arrFlags[3] == 1) {
|
||
|
$strSQL = 'DELETE FROM `' .$rel['tableName1']. '` ' .
|
||
|
'WHERE `' .$rel['fieldName']. '`=' .$elem['id'];
|
||
|
}
|
||
|
// Simple 1:1 relation
|
||
|
if ($arrFlags[3] == 0) {
|
||
|
// Delete relation
|
||
|
if ($arrFlags[2] == 0) {
|
||
|
$strSQL = 'DELETE FROM `' .$rel['tableName1']. '` ' .
|
||
|
'WHERE `' .$rel['fieldName']. '`=' .$elem['id'];
|
||
|
// Set slave to 0
|
||
|
} elseif ($arrFlags[2] == 2) {
|
||
|
$strSQL = 'UPDATE `' .$rel['tableName1']. '` SET `' .$rel['fieldName']. '`=0 ' .
|
||
|
'WHERE `' .$rel['fieldName']. '`=' .$elem['id'];
|
||
|
}
|
||
|
}
|
||
|
// Special 1:n relation for variables
|
||
|
if ($arrFlags[3] == 2) {
|
||
|
$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);
|
||
|
}
|
||
|
}
|
||
|
$strSQL = 'DELETE FROM `' .$rel['tableName1']. '` WHERE `idMaster`=' .$elem['id'];
|
||
|
}
|
||
|
// Special 1:n relation for time definitions
|
||
|
if ($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);
|
||
|
$this->myConfigClass->getConfigSets($arrConfigId);
|
||
|
if ($arrConfigId != 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) {
|
||
|
$this->myConfigClass->getConfigSets($arrConfigId);
|
||
|
if ($arrConfigId != 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
|
||
|
$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 $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($strTable, &$arrRelations)
|
||
|
{
|
||
|
// 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($strTable, $intMasterId, $strMasterfield, $intReporting = 0)
|
||
|
{
|
||
|
$intDeletion = 0;
|
||
|
$arrDSCount = array();
|
||
|
$arrRelations = array();
|
||
|
$arrData = array();
|
||
|
$arrDataCheck = array();
|
||
|
$intReturn = $this->fullTableRelations($strTable, $arrRelations);
|
||
|
if ($intReturn == 1) {
|
||
|
// 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') {
|
||
|
$strSQL = 'SELECT * FROM `' .$elem['tableName1']. '` ' .
|
||
|
'WHERE SUBSTRING_INDEX(`' .$elem['fieldName']."`,'!',1)= $intMasterId";
|
||
|
} else {
|
||
|
$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 ($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
|
||
|
$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 ($arrFlags[0] == 1) {
|
||
|
$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 ($arrFlags[3] == 0) {
|
||
|
// Fetch remote entry
|
||
|
$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 ($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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTable, $intMasterId, $arrSlaveId, $intMulti = 0)
|
||
|
{
|
||
|
// 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);
|
||
|
$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);
|
||
|
$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]) && isset($arrValues[1])) {
|
||
|
$strSQL = 'INSERT INTO `' .$strTable."` SET `idMaster`=$intMasterId, `idSlave`=$arrValues[0], "
|
||
|
." `idHost`=$arrValues[1]";
|
||
|
}
|
||
|
} elseif (($strTable != 'tbl_lnkTimeperiodToTimeperiod') &&
|
||
|
($strTable != 'tbl_lnkDatadomainToConfigtarget')) {
|
||
|
$strSQL = 'INSERT INTO `' . $strTable . '` ' .
|
||
|
"SET `idMaster`=$intMasterId, `idSlave`=$elem, `exclude`=$intExclude";
|
||
|
} else {
|
||
|
$strSQL = 'INSERT INTO `' .$strTable."` SET `idMaster`=$intMasterId, `idSlave`=$elem";
|
||
|
}
|
||
|
}
|
||
|
// Insert data
|
||
|
$intReturn = $this->dataInsert($strSQL, $intDataId);
|
||
|
if ($intReturn != 0) {
|
||
|
$intReturn = 1;
|
||
|
}
|
||
|
}
|
||
|
return $intReturn;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTable, $intMasterId, $arrSlaveId, $intMulti = 0)
|
||
|
{
|
||
|
$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($strTable, $intMasterId)
|
||
|
{
|
||
|
// Define variables
|
||
|
$intDataId = 0;
|
||
|
// Define the SQL statement
|
||
|
$strSQL = 'DELETE FROM `' .$strTable."` WHERE `idMaster`=$intMasterId";
|
||
|
return $this->dataInsert($strSQL, $intDataId);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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 activate
|
||
|
* @return int 0 = successful / 1 = error
|
||
|
* Status message is stored in message class variables
|
||
|
*/
|
||
|
public function dataDeactivate($strTableName, $intDataId = 0)
|
||
|
{
|
||
|
// Define variables
|
||
|
$intReturn = 1;
|
||
|
$arrData = array();
|
||
|
// Get write access groups
|
||
|
$strAccess = $this->myVisClass->getAccessGroups('write');
|
||
|
// Activate datasets
|
||
|
$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 == $elem['id']) || ((filter_input(INPUT_POST, $strChbName) != null) &&
|
||
|
(filter_input(INPUT_POST, $strChbName, FILTER_SANITIZE_STRING) == '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 informations
|
||
|
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 activate
|
||
|
* @return int 0 = successful / 1 = error
|
||
|
* Status message is stored in message class variables
|
||
|
*/
|
||
|
public function dataActivate($strTableName, $intDataId = 0)
|
||
|
{
|
||
|
// Define variables
|
||
|
$intReturn = 1;
|
||
|
$arrData = array();
|
||
|
// Get write access groups
|
||
|
$strAccess = $this->myVisClass->getAccessGroups('write');
|
||
|
// Activate datasets
|
||
|
$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 == $elem['id']) || ((filter_input(INPUT_POST, $strChbName) != null) &&
|
||
|
(filter_input(INPUT_POST, $strChbName, FILTER_SANITIZE_STRING) == '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 informations
|
||
|
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($strTable, $intId)
|
||
|
{
|
||
|
// 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
|
||
|
$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']) && ($arrData[0]['dependent_host_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['dependent_hostgroup_name']) && ($arrData[0]['dependent_hostgroup_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['host_name']) && ($arrData[0]['host_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['hostgroup_name']) && ($arrData[0]['hostgroup_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['dependent_service_description']) &&
|
||
|
($arrData[0]['dependent_service_description'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['service_description']) && ($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 ($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
|
||
|
$strSQL = 'SELECT * FROM `' .$strTable. '` WHERE `id`=' .$intId;
|
||
|
$booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC);
|
||
|
if ($booRet && ($intDC != 0)) {
|
||
|
if (isset($arrData[0]['host_name']) && ($arrData[0]['host_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['hostgroup_name']) && ($arrData[0]['hostgroup_name'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['contacts']) && ($arrData[0]['contacts'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['contact_groups']) && ($arrData[0]['contact_groups'] == 2)) {
|
||
|
$strRawString .= 'any,';
|
||
|
}
|
||
|
if (isset($arrData[0]['service_description']) && ($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 ($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'";
|
||
|
//echo "Hash: ".$strRawString." --> ".sha1($strRawString)."<br>";
|
||
|
return $this->dataInsert($strSQL, $intDataID);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* PRIVATE functions
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* 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($strTableName, $key, $value)
|
||
|
{
|
||
|
$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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($arrData, $intID, $elem, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$arrRelData = array();
|
||
|
$intRelDataCount = 0;
|
||
|
if ($arrData[$intID][$elem['fieldName']] != 0) {
|
||
|
$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) {
|
||
|
$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($arrData, $intID, $elem, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$arrRelData = array();
|
||
|
$intRelDataCount = 0;
|
||
|
if ($arrData[$intID][$elem['fieldName']] == 1) {
|
||
|
$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) {
|
||
|
$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($arrData, $intID, $elem, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$arrRelData = array();
|
||
|
$arrDataVar = array();
|
||
|
$intRelDataCount = 0;
|
||
|
$intDCVar = 0;
|
||
|
if ($arrData[$intID][$elem['fieldName']] != 0) {
|
||
|
$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++;
|
||
|
}
|
||
|
$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($arrData, $intID, $elem, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$arrRelData = array();
|
||
|
$intRelDataCount = 0;
|
||
|
if ($arrData[$intID][$elem['fieldName']] != 0) {
|
||
|
$strSQL = 'SELECT `idSlaveH`,`idSlaveHG`,`idSlaveS` ' .
|
||
|
'FROM `' . $elem['linkTable'] . '` WHERE `idMaster`=' . $arrData[$intID]['id'];
|
||
|
$booReturn = $this->myDBClass->hasDataArray($strSQL, $arrRelData, $intRelDataCount);
|
||
|
if ($booReturn && ($intRelDataCount != 0)) {
|
||
|
foreach ($arrRelData as $elem2) {
|
||
|
$strSQLRel = 'INSERT INTO `' . $elem['linkTable'] . '` ' .
|
||
|
"SET `idMaster`=$intMasterId, `idSlaveH`=" . $elem2['idSlaveH'] . ', ' .
|
||
|
'`idSlaveHG`=' . $elem2['idSlaveHG'] . ', `idSlaveS`=' . $elem2['idSlaveS'];
|
||
|
$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($arrData, $intID, $elem, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$arrRelData = array();
|
||
|
$intRelDataCount = 0;
|
||
|
if ($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) {
|
||
|
$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($arrData, $intID, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$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($arrData, $intID, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$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($arrData, $intID, $intMasterId, $intCheck)
|
||
|
{
|
||
|
$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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTableName, $strKeyField, $intDomainId, $strNewName, $arrData, $intID)
|
||
|
{
|
||
|
$strSQLInsert = 'INSERT INTO `' . $strTableName . '` SET `' . $strKeyField . "`='" . $strNewName . "'";
|
||
|
/** @noinspection ForeachSourceInspection */
|
||
|
foreach ($arrData[$intID] as $key => $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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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($strTableName, $strKeyField, $intDomainId, $intCount, $arrData, $intID)
|
||
|
{
|
||
|
// 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')) {
|
||
|
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` WHERE `' . $strKeyField . "`='$strNewName'";
|
||
|
$booReturn = $this->myDBClass->getFieldData($strSQL);
|
||
|
} else {
|
||
|
$strSQL = 'SELECT `id` FROM `' . $strTableName . '` ' .
|
||
|
'WHERE `' . $strKeyField . "`='$strNewName' AND `config_id`=$intDomainId";
|
||
|
$booReturn = $this->myDBClass->getFieldData($strSQL);
|
||
|
}
|
||
|
// If the name is unused -> break the loop
|
||
|
if ($booReturn == false) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
// Manually overwrite new name for extinfo tables
|
||
|
if ($strTableName == 'tbl_hostextinfo') {
|
||
|
$strNewName = '0';
|
||
|
}
|
||
|
if ($strTableName == 'tbl_serviceextinfo') {
|
||
|
$strNewName = '0';
|
||
|
}
|
||
|
return $strNewName;
|
||
|
}
|
||
|
}
|