<?php /* ---------------------------------------------------------------------------- NagiosQL ------------------------------------------------------------------------------- (c) 2005-2022 by Martin Willisegger Project : NagiosQL Component : Import Class Website : https://sourceforge.net/projects/nagiosql/ Version : 3.5.0 GIT Repo : https://gitlab.com/wizonet/NagiosQL -----------------------------------------------------------------------------*/ /* ---------------------------------------------------------------------------- Class: Data import class ------------------------------------------------------------------------------- Includes any functions to import data from config files Name: NagImportClass -----------------------------------------------------------------------------*/ namespace functions; use function count; use function in_array; use function is_array; class NagImportClass { /* Define class variables */ public $intDomainId = 0; /* Array includes all global settings */ public $strErrorMessage = ''; /* Configuration domain ID */ public $strInfoMessage = ''; /* String including error messages */ /** @var MysqliDbClass */ public $myDBClass; /* String including information messages */ /** @var NagDataClass */ public $myDataClass; /** @var NagConfigClass */ public $myConfigClass; /* Class includes */ private $arrSettings = array(); /* Database class object */ private $strList1 = ''; /* NagiosQL data processing class object */ private $strList2 = ''; /* NagiosQL configuration class object */ /** * NagImportClass constructor. * @param array $arrSession PHP Session array */ public function __construct(array $arrSession) { if (isset($arrSession['SETS'])) { /* Read global settings */ $this->arrSettings = $arrSession['SETS']; } if (isset($arrSession['domain'])) { $this->intDomainId = (int)$arrSession['domain']; } } /** * Import a config file and writes the values to the database * @param string $strFileNameRaw Import file name * @param int $intConfigId Configuration set id * @param int $intOverwrite 0 = Do not replace existing data * 1 = Replace existing data in tables * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ public function fileImport(string $strFileNameRaw, int $intConfigId, int $intOverwrite = 0): int { /* Define variables */ $intBlock = 0; $intRemoveTmp = 0; $strImportFile = ''; $strConfLineTemp = ''; $strBlockKey = ''; $arrData = array(); $strFileName = trim($strFileNameRaw); /* Get file */ $intReturn = $this->getImportFile($intConfigId, $strFileName, $strImportFile, $intRemoveTmp); /* Open and read config file */ if ($intReturn === 0) { $resFile = fopen($strImportFile, 'rb'); $intMultiple = 0; while ($resFile && !feof($resFile)) { /* Read line and remove blank chars */ $strConfLine = trim(fgets($resFile)); /* Process multi-line configuration instructions */ if (substr($strConfLine, -1) === '\\') { if ($intMultiple === 0) { $strConfLineTemp = str_replace("\\", ',', $strConfLine); $intMultiple = 1; } else { $strConfLineTemp .= str_replace("\\", ',', $strConfLine); } continue; } if ($intMultiple === 1) { $strConfLine = $strConfLineTemp . $strConfLine; $intMultiple = 0; } /* Find NAGIOSQL variable */ if (substr_count($strConfLine, '#NAGIOSQL_') !== 0) { $strConfLine = str_replace('#NAGIOSQL_CONFIG_NAME', '_NAGIOSQL_CONFIG_NAME', $strConfLine); } /* Pass comments and empty lines */ if (0 === strpos($strConfLine, '#')) { continue; } if ($strConfLine === '') { continue; } if (($intBlock === 1) && ($strConfLine === '{')) { continue; } /* Process line (remove blanks and cut comments) */ $strLineTmp = str_replace("\;", ':semi:', $strConfLine); $arrLine = preg_split("/\s+/", $strLineTmp); $arrTemp = explode(';', implode(' ', $arrLine)); $strNewLine = str_replace(':semi:', "\;", trim($arrTemp[0])); /* Find block begin */ if ($arrLine[0] === 'define') { $intBlock = 1; $strBlockKey = str_replace('{', '', $arrLine[1]); $arrData = array(); continue; } /* Store the block data to an array */ if (($intBlock === 1) && ($arrLine[0] !== '}')) { $strExclude = 'template_name,alias,name,use'; if (($strBlockKey === 'timeperiod') && (!in_array($arrLine[0], explode(',', $strExclude), true))) { $arrNewLine = explode(' ', $strNewLine); $strTPKey = str_replace(' ' . $arrNewLine[count($arrNewLine) - 1], '', $strNewLine); $strTPValue = $arrNewLine[count($arrNewLine) - 1]; $arrData[$strTPKey] = array('key' => $strTPKey, 'value' => $strTPValue); } else { $key = $arrLine[0]; $value = str_replace($arrLine[0] . ' ', '', $strNewLine); /* Special retry_check_interval, normal_check_interval */ if ($key === 'retry_check_interval') { $key = 'retry_interval'; } if ($key === 'normal_check_interval') { $key = 'check_interval'; } $arrData[$arrLine[0]] = array('key' => $key, 'value' => $value); } } /* Process data at end of block */ if ((substr_count($strConfLine, '}') === 1) && is_array($arrData)) { $intBlock = 0; $intRetVal = $this->importTable($strBlockKey, $arrData, $intOverwrite); if ($intRetVal !== 0) { $intReturn = 1; } } elseif ($arrData === null) { $this->strErrorMessage .= translate('No valid configuration found:') . ' ' . $strFileName . '::'; $intReturn = 1; } } if ($intRemoveTmp === 1) { unlink($strImportFile); } } else { $this->strErrorMessage .= translate('Import file does not exist or is not readable:') . ' ' . $strFileName . '::'; $intReturn = 1; } return $intReturn; } /* PRIVATE functions */ /** * @param int $intConfigId Configuration set id * @param string $strFileName Configuration file name * @param string $strImportFile Temporary file for data import (by reference) * @param int $intRemoveTmp Remove temporary file (1 = yes / 0 = no) (by reference) * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ private function getImportFile(int $intConfigId, string $strFileName, string &$strImportFile, int &$intRemoveTmp): int { $intMethod = 1; $intReturn = 0; $intRemoveTmp = 0; $strImportFile = ''; $strImportFileTmp = ''; $strConfigValue = ''; /* File transfer method */ if (substr_count($strFileName, 'nagiosql_local_imp') === 1) { $intMethod = 1; $intRetVal = 0; } else { $intRetVal = $this->myConfigClass->getConfigData($intConfigId, 'method', $strConfigValue); $intMethod = (int)$strConfigValue; } if ($intRetVal !== 0) { $this->strErrorMessage .= translate('Unable to get configuration data:') . ' method::'; $intReturn = 1; } if ($intReturn === 0) { /* Read import file */ if ($intMethod === 1) { /* Local file system */ if (!is_readable($strFileName)) { $this->strErrorMessage .= translate('Cannot open the data file (check the permissions)!') . ' ' . $strFileName . '::'; $intReturn = 1; } else { $strImportFileTmp = $strFileName; } } elseif ($intMethod === 2) { /* FTP access */ /* Open ftp connection */ $intRetVal = $this->myConfigClass->getFTPConnection($intConfigId); if ($intRetVal !== 0) { $this->strErrorMessage .= $this->myConfigClass->strErrorMessage; $intReturn = 1; } else { /* Transfer file from remote server to a local temp file */ if (isset($this->arrSettings['path']['tempdir'])) { $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql_imp'); } else { $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql_imp'); } if (!ftp_get($this->myConfigClass->conFTPConId, $strConfigFile, $strFileName, FTP_ASCII)) { $this->strErrorMessage .= translate('Cannot receive the configuration file (FTP connection)!') . '::'; ftp_close($this->myConfigClass->conFTPConId); $intReturn = 1; } else { $intRemoveTmp = 1; $strImportFileTmp = $strConfigFile; } } } elseif ($intMethod === 3) { /* SSH Access */ /* Open ssh connection */ $intRetVal = $this->myConfigClass->getSSHConnection($intConfigId); if ($intRetVal !== 0) { $this->strErrorMessage .= $this->myConfigClass->strErrorMessage; $intReturn = 1; } else { /* Transfer file from remote server to a local temp file */ if (isset($this->arrSettings['path']['tempdir'])) { $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql_imp'); } else { $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql_imp'); } if (!ssh2_scp_recv($this->myConfigClass->resSSHConId, $strFileName, $strConfigFile)) { $this->strErrorMessage .= translate('Cannot receive the configuration file (SSH connection)!') . '::'; $intReturn = 1; } else { $intRemoveTmp = 1; $strImportFileTmp = $strConfigFile; } } } /* Open and read config file */ if (file_exists($strImportFileTmp) && is_readable($strImportFileTmp)) { $strImportFile = (string)$strImportFileTmp; } else { $intReturn = 1; $intRemoveTmp = 0; } } return $intReturn; } /** * Writes the block data to the database * @param string $strBlockKey Config key (from define) * @param array $arrImportData Imported block data * @param int $intOverwrite 0 = Do not replace existing data * 1 = Replace existing data in tables * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ private function importTable(string $strBlockKey, array $arrImportData, int $intOverwrite): int { /* Define variables */ $intIsTemplate = 0; $intExists = 0; $intInsertRelations = 0; $intInsertVariables = 0; $strHash = ''; $strConfigName = ''; $arrImportRelations = array(); $arrFreeVariables = array(); $arrRelations = array(); $strTable = ''; $strKeyField = ''; /* Block data from template or real configuration? */ if (array_key_exists('name', $arrImportData) && (isset($arrImportData['register']) && ((int)$arrImportData['register']['value'] === 0))) { $intIsTemplate = 1; } /* Get table name and key for import */ $intReturn = $this->getTableData($strBlockKey, $intIsTemplate, $strTable, $strKeyField); if ($intReturn === 0) { /* Create an import hash if no key field is available */ if ($strKeyField === '') { $this->createHash($strTable, $arrImportData, $strHash, $strConfigName); $arrImportData['config_name']['key'] = 'config_name'; $arrImportData['config_name']['value'] = $strConfigName; $strKeyField = 'config_name'; } else { $strHash = ''; } /* Get relation data */ $intRelation = $this->myDataClass->tableRelations($strTable, $arrRelations); /* Does this entry already exist? */ if (($intIsTemplate === 0) && ($strKeyField !== '') && isset($arrImportData[$strKeyField])) { if ($strHash === '') { /* Special key field values */ if ($strBlockKey === 'hostextinfo') { $strSQL = 'SELECT `id`FROM `tbl_host` ' . "WHERE `host_name`='" . $arrImportData[$strKeyField]['value'] . "'"; $intHost = (int)$this->myDBClass->getFieldData($strSQL); /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $strTable . '` ' . 'WHERE `config_id`=' . $this->intDomainId . ' AND `' . $strKeyField . "`='" . $intHost . "'"; } else { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $strTable . '` ' . 'WHERE `config_id`=' . $this->intDomainId . ' AND ' . '`' . $strKeyField . "`='" . $arrImportData[$strKeyField]['value'] . "'"; } } else { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $strTable . '` ' . 'WHERE `config_id`=' . $this->intDomainId . " AND `import_hash`='" . $strHash . "'"; } $intExists = $this->myDBClass->getFieldData($strSQL); if ($intExists === '') { $intExists = 0; } } elseif (($intIsTemplate === 1) && ($strKeyField !== '') && isset($arrImportData['name'])) { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $strTable . '` ' . 'WHERE `config_id`=' . $this->intDomainId . ' AND ' . "`template_name`='" . $arrImportData['name']['value'] . "'"; $intExists = $this->myDBClass->getFieldData($strSQL); if ($intExists === '') { $intExists = 0; } } /* Entry exsists but should not be overwritten */ if (($intExists !== 0) && ($intOverwrite === 0)) { if ($strKeyField === 'config_name') { /** @noinspection SqlResolve */ $strSQLConfig = 'SELECT `config_name` FROM `' . $strTable . '` WHERE `id`=' . $intExists; $arrImportData[$strKeyField]['value'] = $this->myDBClass->getFieldData($strSQLConfig); } $this->strInfoMessage .= translate('Entry') . ' <b class="blackmessage">' . $strKeyField . ' -> ' . $arrImportData[$strKeyField]['value'] . '</b> ' . translate('inside') . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('exists and were not overwritten') . '::'; } elseif (isset($arrImportData[$strKeyField]) && ($arrImportData[$strKeyField] === '*')) { /* Do not write "*" values */ $this->strInfoMessage .= translate('Entry') . ' <b class="blackmessage">' . $strKeyField . ' -> ' . $arrImportData[$strKeyField]['value'] . '</b> ' . translate('inside') . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('were not written') . '::'; } else { $strSQL1 = ''; $strSQL2 = ''; /* Define SQL statement - part 1 */ $this->getSQLPart1( $arrImportData, $strHash, $intExists, $strTable, $strKeyField, $intRelation, $arrRelations, $strSQL1, $strSQL2 ); /* Read command configurations */ [$strVCValues, $intWriteConfig, $strVIValues, $strRLValues, $strVWValues] = $this->getImportValues($arrImportData, $strKeyField, $strSQL1, $strTable); /* Build value statemets */ foreach ($arrImportData as $elem) { /* Write text values */ $intCheckVC = $this->writeTextValues( $elem, $strVCValues, $strSQL1, $intIsTemplate, $intExists, $strTable ); /* Write status values */ $intCheckVI = $this->writeStatusValues($elem, $strVIValues, $strSQL1); /* Write integer values */ $intCheckVW = $this->writeIntegerValues($elem, $strVWValues, $strSQL1); /* Write relations */ $intCheckRel = $this->writeRelations($elem, $strRLValues, $arrImportRelations, $intInsertRelations); /* Write free variables */ $intCheck = $intCheckVC + $intCheckVI + $intCheckVW + $intCheckRel; if ($intCheck === 0) { $arrTemp = array(); $arrTemp['key'] = $elem['key']; $arrTemp['value'] = $elem['value']; $arrFreeVariables[] = $arrTemp; $intInsertVariables = 1; } } $strTemp1 = ''; $strTemp2 = ''; /* Update database */ if ($intWriteConfig === 1) { $booResult = $this->myDBClass->insertData($strSQL1 . $strSQL2); } else { $booResult = false; } if ($strKeyField === '') { $strKey = $strConfigName; } else { $strKey = $strKeyField; } if ($booResult !== true) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; if ($strKeyField !== '') { $this->strErrorMessage .= translate('Entry') . ' <b class="blackmessage">' . $strKey . ' -> ' . $arrImportData[$strKeyField]['value'] . '</b> ' . translate('inside') . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('could not be inserted:') . ' ' . $this->myDBClass->strErrorMessage . '::'; } if ($strKeyField === '') { $this->strErrorMessage .= translate('Entry') . ' <b class="blackmessage">' . $strTemp1 . ' -> ' . $strTemp2 . translate('inside') . '</b> ' . $strTable . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('could not be inserted:') . ' ' . $this->myDBClass->strErrorMessage . '::'; } return 1; } if ($strKeyField !== '') { $this->strInfoMessage .= translate('Entry') . ' <b class="blackmessage">' . $strKey . ' -> ' . $arrImportData[$strKeyField]['value'] . '</b> ' . translate('inside') . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('successfully inserted') . '::'; } if ($strKeyField === '') { $this->strInfoMessage .= translate('Entry') . ' <b class="blackmessage">' . $strTemp1 . ' -> ' . $strTemp2 . '</b> ' . translate('inside') . ' <b class="blackmessage">' . $strTable . '</b> ' . translate('successfully inserted') . '::'; } /* Define data ID */ if ($intExists !== 0) { $intDataId = $intExists; } else { $intDataId = $this->myDBClass->intLastId; } /* Are there any relations to be filled in? */ if ($intInsertRelations === 1) { foreach ($arrImportRelations as $elem) { foreach ($arrRelations as $reldata) { if ($reldata['fieldName'] === $elem['key']) { $strValue = $elem['value']; $strKey = $elem['key']; if ($elem['key'] === 'check_command') { $this->writeRelation5($strValue, $intDataId, $strTable, $reldata); } elseif ((int)$reldata['type'] === 1) { $this->writeRelation1( $strKey, $strValue, $intDataId, $strTable, $reldata, $arrImportData ); } elseif ((int)$reldata['type'] === 2) { $this->writeRelation2($strKey, $strValue, $intDataId, $strTable, $reldata); } elseif ((int)$reldata['type'] === 3) { $this->writeRelation3($strValue, $intDataId, $strTable, $reldata); } elseif ((int)$reldata['type'] === 4) { $this->writeRelation4($strKey, $strValue, $intDataId, 0, $strTable, $reldata); } elseif ((int)$reldata['type'] === 5) { $this->writeRelation6($strValue, $intDataId, $strTable, $reldata); } elseif ((int)$reldata['type'] === 6) { $this->writeRelation7($strValue, $intDataId, $strTable, $reldata); } elseif ((int)$reldata['type'] === 7) { $this->writeRelation8($strValue, $intDataId, $strTable, $reldata); } } } } } /* Are there any free variables ore time definitions to be filled in? */ if ($intInsertVariables === 1) { if ($strTable === 'tbl_timeperiod') { /* Remove old values */ $strSQL = "DELETE FROM `tbl_timedefinition` WHERE `tipId` = $intDataId"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } foreach ($arrFreeVariables as $elem) { $strSQL = "INSERT INTO `tbl_timedefinition` SET `tipId` = $intDataId, " . "`definition` = '" . addslashes($elem['key']) . "', " . "`range` = '" . addslashes($elem['value']) . "'"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } else { $intRemoveOldVariables = 1; foreach ($arrFreeVariables as $elem) { foreach ($arrRelations as $reldata) { if ((int)$reldata['type'] === 4) { $this->writeRelation4( $elem['key'], $elem['value'], $intDataId, $intRemoveOldVariables, $strTable, $reldata ); $intRemoveOldVariables = 0; } } } } } /* Update Table times */ $this->myDataClass->updateStatusTable($strTable); } } return $intReturn; } /** * Get table name and key for import * @param string $strBlockKey Block data key * @param int $intIsTemplate Template data 1 = yes / 0 - no * @param string $strTable Template name * @param string $strKeyField Table key name * @return int 0 = successful / 1 = error */ private function getTableData(string $strBlockKey, int $intIsTemplate, string &$strTable, string &$strKeyField): int { /* Define variables */ $intReturn = 0; $arrTableData['command'] = array('tbl_command', 'command_name'); $arrTableData['contactgroup'] = array('tbl_contactgroup', 'contactgroup_name'); $arrTableData['contact'] = array('tbl_contact', 'contact_name'); $arrTableData['timeperiod'] = array('tbl_timeperiod', 'timeperiod_name'); $arrTableData['host'] = array('tbl_host', 'host_name'); $arrTableData['service'] = array('tbl_service', ''); $arrTableData['hostgroup'] = array('tbl_hostgroup', 'hostgroup_name'); $arrTableData['servicegroup'] = array('tbl_servicegroup', 'servicegroup_name'); $arrTableData['hostescalation'] = array('tbl_hostescalation', ''); $arrTableData['serviceescalation'] = array('tbl_serviceescalation', ''); $arrTableData['hostdependency'] = array('tbl_hostdependency', ''); $arrTableData['servicedependency'] = array('tbl_servicedependency', ''); $arrTableData['hostextinfo'] = array('tbl_hostextinfo', 'host_name'); $arrTableData['serviceextinfo'] = array('tbl_serviceextinfo', ''); $arrTableDataTpl['contact'] = array('tbl_contacttemplate', 'name'); $arrTableDataTpl['host'] = array('tbl_hosttemplate', 'name'); $arrTableDataTpl['service'] = array('tbl_servicetemplate', 'name'); /* Define table name and key */ if (($intIsTemplate === 0) && isset($arrTableData[$strBlockKey])) { $strTable = $arrTableData[$strBlockKey][0]; /** @noinspection MultiAssignmentUsageInspection */ $strKeyField = $arrTableData[$strBlockKey][1]; } elseif (($intIsTemplate === 1) && isset($arrTableDataTpl[$strBlockKey])) { $strTable = $arrTableDataTpl[$strBlockKey][0]; /** @noinspection MultiAssignmentUsageInspection */ $strKeyField = $arrTableDataTpl[$strBlockKey][1]; } else { $this->strErrorMessage .= translate('Table for import definition') . $strBlockKey . translate('is not available!') . '::'; $intReturn = 1; } return $intReturn; } /** * Create a unique data hash from table data * @param string $strTable * @param array $arrBlockData * @param string $strHash * @param string $strConfigName */ public function createHash(string $strTable, array $arrBlockData, string &$strHash, string &$strConfigName): void { $strRawString = ''; $strConfigName = 'imp_temporary'; if ($strTable === 'tbl_service') { /* HASH from any host, any hostgroup and service description - step 1 */ if (isset($arrBlockData['host_name'])) { $strRawString .= $arrBlockData['host_name']['value'] . ','; } if (isset($arrBlockData['hostgroup_name'])) { $strRawString .= $arrBlockData['hostgroup_name']['value'] . ','; } /* Replace *, + and ! in HASH raw string */ $strRawString = str_replace(array('*,', '!', '+'), array('any,', 'not_', ''), $strRawString); /* Create configuration name from NagiosQL variable if exists */ if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) { $strConfigName = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value']; } else { /* Create configuration name from first two hosts / hostgroups */ $arrConfig = explode(',', $strRawString); if (isset($arrConfig[0]) && ($arrConfig[0] !== '')) { $strConfigName = 'imp_' . $arrConfig[0]; } if (isset($arrConfig[1]) && ($arrConfig[1] !== '')) { $strConfigName .= '_' . $arrConfig[1]; } } /* HASH from any host, any hostgroup and service description - step 2 */ if (isset($arrBlockData['service_description'])) { $strRawString .= $arrBlockData['service_description']['value'] . ','; } if (isset($arrBlockData['display_name'])) { $strRawString .= $arrBlockData['display_name']['value'] . ','; } if (isset($arrBlockData['check_command'])) { $strRawString .= $arrBlockData['check_command']['value'] . ','; } } if (($strTable === 'tbl_hostdependency') || ($strTable === 'tbl_servicedependency')) { $strRawString1 = ''; $strRawString2 = ''; $strRawString3 = ''; /* HASH from any dependent host and any dependent hostgroup */ if (isset($arrBlockData['dependent_host_name'])) { $strRawString1 .= $arrBlockData['dependent_host_name']['value'] . ','; } if (isset($arrBlockData['dependent_hostgroup_name'])) { $strRawString1 .= $arrBlockData['dependent_hostgroup_name']['value'] . ','; } if (isset($arrBlockData['host_name'])) { $strRawString2 .= $arrBlockData['host_name']['value'] . ','; } if (isset($arrBlockData['hostgroup_name'])) { $strRawString2 .= $arrBlockData['hostgroup_name']['value'] . ','; } if (isset($arrBlockData['dependent_service_description'])) { $strRawString3 .= $arrBlockData['dependent_service_description']['value'] . ','; } if (isset($arrBlockData['service_description'])) { $strRawString3 .= $arrBlockData['service_description']['value'] . ','; } if (isset($arrBlockData['dependent_servicegroup_name'])) { $strRawString3 .= $arrBlockData['dependent_servicegroup_name']['value'] . ','; } if (isset($arrBlockData['servicegroup_name'])) { $strRawString3 .= $arrBlockData['servicegroup_name']['value'] . ','; } /* Replace *, + and ! in HASH raw string */ $strRawString1 = str_replace('*,', 'any,', $strRawString1); $strRawString2 = str_replace('*,', 'any,', $strRawString2); $strRawString3 = str_replace('*,', 'any,', $strRawString3); $strRawString1 = str_replace('!', 'not_', $strRawString1); $strRawString2 = str_replace('!', 'not_', $strRawString2); $strRawString3 = str_replace('!', 'not_', $strRawString3); /* Create configuration name from NagiosQL variable if exists */ if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) { $strConfigName = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value']; } else { $arrConfig1 = explode(',', $strRawString1); $arrConfig2 = explode(',', $strRawString2); $arrConfig3 = explode(',', $strRawString3); if (isset($arrConfig1[0])) { $strConfigName = 'imp_' . $arrConfig1[0]; } if (isset($arrConfig2[0])) { $strConfigName .= '_' . $arrConfig2[0]; } if (isset($arrConfig3[0])) { $strConfigName .= '_' . $arrConfig3[0]; } /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $strTable . "` WHERE `config_name`='$strConfigName'"; $booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC); if ($booRet && ($intDC !== 0)) { $intCounter = 1; do { $strConfigNameTemp = $strConfigName . '_' . $intCounter; /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $strTable . "` WHERE `config_name`='$strConfigNameTemp'"; $booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC); $intCounter++; } while ($booRet && ($intDC !== 0)); $strConfigName = $strConfigNameTemp; } } /* HASH string */ $strRawString = $strRawString1 . $strRawString2 . $strRawString3; $strRawString = substr($strRawString, 0, -1); } if (($strTable === 'tbl_hostescalation') || ($strTable === 'tbl_serviceescalation')) { $strRawString1 = ''; $strRawString2 = ''; $strRawString3 = ''; /* HASH from any host and any hostgroup */ if (isset($arrBlockData['host_name'])) { $strRawString1 .= $arrBlockData['host_name']['value'] . ','; } if (isset($arrBlockData['hostgroup_name'])) { $strRawString1 .= $arrBlockData['hostgroup_name']['value'] . ','; } if (isset($arrBlockData['contacts'])) { $strRawString2 .= $arrBlockData['contacts']['value'] . ','; } if (isset($arrBlockData['contact_groups'])) { $strRawString2 .= $arrBlockData['contact_groups']['value'] . ','; } if (isset($arrBlockData['service_description'])) { $strRawString3 .= $arrBlockData['service_description']['value'] . ','; } /* Replace *, + and ! in HASH raw string */ $strRawString1 = str_replace('*,', 'any,', $strRawString1); $strRawString2 = str_replace('*,', 'any,', $strRawString2); $strRawString3 = str_replace('*,', 'any,', $strRawString3); $strRawString1 = str_replace('!', 'not_', $strRawString1); $strRawString2 = str_replace('!', 'not_', $strRawString2); $strRawString3 = str_replace('!', 'not_', $strRawString3); /* Create configuration name from NagiosQL variable if exists */ if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) { $strConfigName = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value']; } else { $arrConfig1 = explode(',', $strRawString1); $arrConfig2 = explode(',', $strRawString2); $arrConfig3 = explode(',', $strRawString3); if (isset($arrConfig1[0])) { $strConfigName = 'imp_' . $arrConfig1[0]; } if (isset($arrConfig2[0])) { $strConfigName .= '_' . $arrConfig2[0]; } if (isset($arrConfig3[0])) { $strConfigName .= '_' . $arrConfig3[0]; } /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $strTable . "` WHERE `config_name`='$strConfigName'"; $booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC); if ($booRet && ($intDC !== 0)) { $intCounter = 1; do { $strConfigNameTemp = $strConfigName . '_' . $intCounter; /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $strTable . "` WHERE `config_name`='$strConfigNameTemp'"; $booRet = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDC); $intCounter++; } while ($booRet && ($intDC !== 0)); $strConfigName = $strConfigNameTemp; } } /* HASH string */ $strRawString = $strRawString1 . $strRawString2 . $strRawString3; $strRawString = substr($strRawString, 0, -1); } if ($strTable === 'tbl_serviceextinfo') { /* HASH from any host, any hostgroup and service description - step 1 */ if (isset($arrBlockData['host_name'])) { $strRawString .= $arrBlockData['host_name']['value'] . ','; } if (isset($arrBlockData['service_description'])) { $strRawString .= $arrBlockData['service_description']['value'] . ','; } /* HASH string */ $strRawString = substr($strRawString, 0, -1); /* Create configuration name from NagiosQL variable if exists */ if (isset($arrBlockData['_NAGIOSQL_CONFIG_NAME'])) { $strConfigName = $arrBlockData['_NAGIOSQL_CONFIG_NAME']['value']; } else { /* Create configuration name from first two items */ $arrConfig = explode(',', $strRawString); if (isset($arrConfig[0]) && ($arrConfig[0] !== '')) { $strConfigName = 'imp_' . $arrConfig[0]; } if (isset($arrConfig[1]) && ($arrConfig[1] !== '')) { $strConfigName .= '_' . $arrConfig[1]; } } } while (substr_count($strRawString, ' ') !== 0) { $strRawString = str_replace(' ', '', $strRawString); } /* Sort hash string */ $arrTemp = explode(',', $strRawString); sort($arrTemp); $strRawString = implode(',', $arrTemp); $strHash = sha1($strRawString); //echo "Hash: ".$strRawString." --> ".$strHash."<br>"; } /** * @param array $arrImportData Imported block data * @param string $strHash Unique data hash * @param int $intExists Does the dataset already exist? * @param string $strTable Table name * @param string $strKeyField Table key file * @param int $intRelation Relation type * @param array $arrRelations Relation array * @param string $strSQL1 SQL statement part 1 * @param string $strSQL2 SQL statement part 2 */ private function getSQLPart1( array &$arrImportData, string $strHash, int $intExists, string $strTable, string $strKeyField, int $intRelation, array $arrRelations, string &$strSQL1, string &$strSQL2 ): void { /* Define variables */ $intActive = 1; $arrData = array(); $intDataCount = 0; if ($strHash !== '') { $strHash = " `import_hash`='" . $strHash . "', "; } if ($intExists !== 0) { /* Update database */ $strSQL1 = 'UPDATE `' . $strTable . '` SET '; $strSQL2 = ' `config_id`=' . $this->intDomainId . ", $strHash `active`='$intActive', " . "`last_modified`=NOW() WHERE `id`=$intExists"; /* Keep config name while update */ if (($strKeyField === 'config_name') && !isset($arrImportData['_NAGIOSQL_CONFIG_NAME'])) { /** @noinspection SqlResolve */ $strSQLConfig = 'SELECT `config_name` FROM `' . $strTable . '` WHERE `id`=' . $intExists; $arrImportData['config_name']['value'] = $this->myDBClass->getFieldData($strSQLConfig); } /* Remove free variables */ if ($intRelation !== 0) { foreach ($arrRelations as $relVar) { if ((int)$relVar['type'] === 4) { /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $relVar['linkTable'] . "` WHERE `idMaster`=$intExists"; $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount); if ($booReturn && ($intDataCount !== 0)) { foreach ($arrData as $elem) { $strSQL = 'DELETE FROM `tbl_variabledefinition` WHERE `id`=' . $elem['idSlave']; $this->myDataClass->dataInsert($strSQL, $intInsertId); } } /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $relVar['linkTable'] . "` WHERE `idMaster`=$intExists"; $this->myDataClass->dataInsert($strSQL, $intInsertId); } } } } else { /* DB Eintrag einfügen */ $test = ''; /** @noinspection SqlResolve */ $strSQL1 = 'INSERT INTO `' . $strTable . "` SET $test"; $strSQL2 = ' `config_id`=' . $this->intDomainId . ", $strHash `active`='$intActive', `last_modified`=NOW()"; } } /** * @param array $arrImportData Imported block data * @param string $strKeyField Table key file * @param string $strSQL1 SQL statement part 1 * @param string $strTable Table name * @return array List of import values */ private function getImportValues(array $arrImportData, string $strKeyField, string &$strSQL1, string $strTable): array { /* Description for the values * -------------------------- * $strVCValues = Simple text values, will be stored as varchar / null = 'null' as text value / empty = '' * $strRLValues = Relations - values with relations to other tables * $strVWValues = Integer values - will be stored as INT values / null = -1, / empty values as NULL * $strVIValues = Decision values 0 = no, 1 = yes, 2 = skip, 3 = null */ /* Define variables */ $strVCValues = ''; $strVIValues = ''; $strRLValues = ''; $strVWValues = ''; $intWriteConfig = 0; /* Read command configurations */ if ($strKeyField === 'command_name') { $strVCValues = 'command_name,command_line'; /* Find out command type */ if (isset($arrImportData['command_line'])) { if ((substr_count($arrImportData['command_line']['value'], 'ARG1') !== 0) || (substr_count($arrImportData['command_line']['value'], 'USER1') !== 0)) { $strSQL1 .= '`command_type` = 1,'; } else { $strSQL1 .= '`command_type` = 2,'; } } $intWriteConfig = 1; /* Read contact configurations */ } elseif ($strKeyField === 'contact_name') { $strVCValues = 'contact_name,alias,host_notification_options,service_notification_options,email,'; $strVCValues .= 'pager,address1,address2,address3,address4,address5,address6,name'; $strVWValues = 'minimum_importance'; $strVIValues = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,'; $strVIValues .= 'retain_status_information,retain_nonstatus_information'; $strRLValues = 'contactgroups,host_notification_period,service_notification_period,'; $strRLValues .= 'host_notification_commands,service_notification_commands,use'; $intWriteConfig = 1; /* Read contactgroup configurations */ } elseif ($strKeyField === 'contactgroup_name') { $strVCValues = 'contactgroup_name,alias'; $strRLValues = 'members,contactgroup_members'; $intWriteConfig = 1; /* Read timeperiod configurations */ } elseif ($strKeyField === 'timeperiod_name') { $strVCValues = 'timeperiod_name,alias,name'; $strRLValues = 'use,exclude'; $intWriteConfig = 1; /* Read contacttemplate configurations */ } elseif (($strKeyField === 'name') && ($strTable === 'tbl_contacttemplate')) { $strVCValues = 'contact_name,alias,host_notification_options,service_notification_options,email,'; $strVCValues .= 'pager,address1,address2,address3,address4,address5,address6,name'; $strVWValues = 'minimum_importance'; $strVIValues = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,'; $strVIValues .= 'retain_status_information,retain_nonstatus_information'; $strRLValues = 'contactgroups,host_notification_period,service_notification_period,'; $strRLValues .= 'host_notification_commands,service_notification_commands,use'; $intWriteConfig = 1; /* Read host configurations */ } elseif ($strTable === 'tbl_host') { $strVCValues = 'host_name,alias,display_name,address,initial_state,flap_detection_options,'; $strVCValues .= 'notification_options,stalking_options,notes,notes_url,action_url,icon_image,'; $strVCValues .= 'icon_image_alt,vrml_image,statusmap_image,2d_coords,3d_coords,name'; $strVWValues = 'max_check_attempts,retry_interval,check_interval,freshness_threshold,low_flap_threshold,'; $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance'; $strVIValues = 'active_checks_enabled,passive_checks_enabled,check_freshness,obsess_over_host,'; $strVIValues .= 'event_handler_enabled,flap_detection_enabled,process_perf_data,retain_status_information,'; $strVIValues .= 'retain_nonstatus_information,notifications_enabled'; $strRLValues = 'parents,hostgroups,check_command,use,check_period,event_handler,contacts,contact_groups,'; $strRLValues .= 'notification_period'; $intWriteConfig = 1; /* Read hosttemplate configurations */ } elseif (($strKeyField === 'name') && ($strTable === 'tbl_hosttemplate')) { $strVCValues = 'template_name,alias,initial_state,flap_detection_options,notification_options,'; $strVCValues .= 'stalking_options,notes,notes_url,action_url,icon_image,icon_image_alt,vrml_image,'; $strVCValues .= 'statusmap_image,2d_coords,3d_coords,name'; $strVWValues = 'max_check_attempts,retry_interval,check_interval,freshness_threshold,low_flap_threshold,'; $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance'; $strVIValues = 'active_checks_enabled,passive_checks_enabled,check_freshness,obsess_over_host,'; $strVIValues .= 'event_handler_enabled,flap_detection_enabled,process_perf_data,retain_status_information,'; $strVIValues .= 'retain_nonstatus_information,notifications_enabled'; $strRLValues = 'parents,hostgroups,check_command,use,check_period,event_handler,contacts,contact_groups,'; $strRLValues .= 'notification_period'; $intWriteConfig = 1; /* Read hostgroup configurations */ } elseif ($strKeyField === 'hostgroup_name') { $strVCValues = 'hostgroup_name,alias,notes,notes_url,action_url'; $strRLValues = 'members,hostgroup_members'; $intWriteConfig = 1; /* Read service configurations */ } elseif ($strTable === 'tbl_service') { $strVCValues = 'service_description,display_name,initial_state,flap_detection_options,stalking_options,'; $strVCValues .= 'notes,notes_url,action_url,icon_image,icon_image_alt,name,config_name,'; $strVCValues .= 'notification_options'; $strVWValues = 'max_check_attempts,check_interval,retry_interval,freshness_threshold,low_flap_threshold,'; $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance'; $strVIValues = 'is_volatile,active_checks_enabled,passive_checks_enabled,parallelize_check,'; $strVIValues .= 'obsess_over_service,check_freshness,event_handler_enabled,flap_detection_enabled,'; $strVIValues .= 'process_perf_data,retain_status_information,retain_nonstatus_information,'; $strVIValues .= 'notifications_enabled'; $strRLValues = 'host_name,hostgroup_name,servicegroups,use,check_command,check_period,event_handler,'; $strRLValues .= 'notification_period,contacts,contact_groups,parents'; $intWriteConfig = 1; /* Read servicetemplate configurations */ } elseif (($strKeyField === 'name') && ($strTable === 'tbl_servicetemplate')) { $strVCValues = 'template_name,service_description,display_name,initial_state,flap_detection_options,'; $strVCValues .= 'stalking_options,notes,notes_url,action_url,icon_image,icon_image_alt,name,'; $strVCValues .= 'notification_options'; $strVWValues = 'max_check_attempts,check_interval,retry_interval,freshness_threshold,low_flap_threshold,'; $strVWValues .= 'high_flap_threshold,notification_interval,first_notification_delay,importance'; $strVIValues = 'is_volatile,active_checks_enabled,passive_checks_enabled,parallelize_check,'; $strVIValues .= 'obsess_over_service,check_freshness,event_handler_enabled,flap_detection_enabled,'; $strVIValues .= 'process_perf_data,retain_status_information,retain_nonstatus_information,'; $strVIValues .= 'notifications_enabled'; $strRLValues = 'host_name,hostgroup_name,servicegroups,use,check_command,check_period,event_handler,'; $strRLValues .= 'notification_period,contacts,contact_groups,parents'; $intWriteConfig = 1; /* Read servicegroup configurations */ } elseif ($strKeyField === 'servicegroup_name') { $strVCValues = 'servicegroup_name,alias,notes,notes_url,action_url'; $strRLValues = 'members,servicegroup_members'; $intWriteConfig = 1; /* Read hostdependency configurations */ } elseif ($strTable === 'tbl_hostdependency') { $strVCValues = 'config_name,execution_failure_criteria,notification_failure_criteria'; $strVIValues = 'inherits_parent'; $strRLValues = 'dependent_host_name,dependent_hostgroup_name,host_name,hostgroup_name,dependency_period'; $intWriteConfig = 1; /* Read hostescalation configurations */ } elseif ($strTable === 'tbl_hostescalation') { $strVCValues = 'config_name,escalation_options'; $strVWValues = 'first_notification,last_notification,notification_interval'; $strRLValues = 'host_name,hostgroup_name,contacts,contact_groups,escalation_period'; $intWriteConfig = 1; /* Read hostextinfo configurations */ } elseif ($strTable === 'tbl_hostextinfo') { $strVCValues = 'notes,notes_url,action_url,icon_image,icon_image_alt,vrml_image,statusmap_image,'; $strVCValues .= '2d_coords,3d_coords'; $strRLValues = 'host_name'; $intWriteConfig = 1; /* Read servicedependency configurations */ } elseif ($strTable === 'tbl_servicedependency') { $strVCValues = 'config_name,execution_failure_criteria,notification_failure_criteria'; $strVIValues = 'inherits_parent'; $strRLValues = 'dependent_host_name,dependent_hostgroup_name,dependent_service_description,host_name,'; $strRLValues .= 'hostgroup_name,dependency_period,service_description,dependent_servicegroup_name,'; $strRLValues .= 'servicegroup_name'; $intWriteConfig = 1; /* Read serviceescalation configurations */ } elseif ($strTable === 'tbl_serviceescalation') { $strVCValues = 'config_name,escalation_options'; $strVIValues = 'first_notification,last_notification,notification_interval'; $strRLValues = 'host_name,hostgroup_name,contacts,contact_groups,service_description,escalation_period,'; $strRLValues .= 'servicegroup_name'; $intWriteConfig = 1; /* Serviceextinfo configurations */ } elseif ($strTable === 'tbl_serviceextinfo') { $strVCValues = 'notes,notes_url,action_url,icon_image,icon_image_alt'; $strRLValues = 'host_name,service_description'; $intWriteConfig = 1; } /* Common values (all configurations) */ if ($strVWValues === '') { $strVWValues = 'register'; } else { $strVWValues .= ',register'; } return array($strVCValues, $intWriteConfig, $strVIValues, $strRLValues, $strVWValues); } /** * @param array $elem * @param string $strVCValues * @param string $strSQL1 * @param int $intIsTemplate * @param int $intExists * @param string $strTable * @return int */ private function writeTextValues(array $elem, string $strVCValues, string &$strSQL1, int $intIsTemplate, int $intExists, string $strTable): int { $intCheck = 0; if (in_array($elem['key'], explode(',', $strVCValues), true)) { if (strtolower(trim($elem['value'])) === 'null') { $strSQL1 .= '`' . $elem['key'] . "` = 'null',"; } else { $elem['value'] = addslashes($elem['value']); if ($intIsTemplate === 1) { if ($elem['key'] === 'name') { $strSQL1 .= "template_name = '" . $elem['value'] . "',"; } elseif (($elem['key'] === 'config_name') && ($intExists !== 0)) { /* Do not overwrite config_names during an update! */ /** @noinspection SqlResolve */ $strSQLConfig = 'SELECT `config_name` FROM `' . $strTable . '` WHERE `id`=' . $intExists; $elem['value'] = $this->myDBClass->getFieldData($strSQLConfig); $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',"; } else { $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',"; } } else { $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',"; } } $intCheck = 1; } return $intCheck; } /** * @param array $elem * @param string $strVIValues * @param string $strSQL1 * @return int */ private function writeStatusValues(array $elem, string $strVIValues, string &$strSQL1): int { $intCheck = 0; if (in_array($elem['key'], explode(',', $strVIValues), true)) { if (strtolower(trim($elem['value'])) === 'null') { $strSQL1 .= '`' . $elem['key'] . '` = 3,'; } else { $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',"; } $intCheck = 1; } return $intCheck; } /** * @param array $elem * @param string $strVWValues * @param string $strSQL1 * @return int */ private function writeIntegerValues(array $elem, string $strVWValues, string &$strSQL1): int { $intCheck = 0; if (in_array($elem['key'], explode(',', $strVWValues), true)) { if (strtolower(trim($elem['value'])) === 'null') { $strSQL1 .= '`' . $elem['key'] . '` = -1,'; } else { $strSQL1 .= '`' . $elem['key'] . "` = '" . $elem['value'] . "',"; } $intCheck = 1; } return $intCheck; } /** * @param array $elem * @param string $strRLValues * @param array $arrImportRelations * @param int $intInsertRelations * @return int */ private function writeRelations(array &$elem, string $strRLValues, array &$arrImportRelations, int &$intInsertRelations): int { $intCheck = 0; if (($intCheck === 0) && in_array($elem['key'], explode(',', $strRLValues), true)) { if ($elem['key'] === 'use') { $elem['key'] = 'use_template'; } $arrTemp = array(); $arrTemp['key'] = $elem['key']; $arrTemp['value'] = $elem['value']; $arrImportRelations[] = $arrTemp; $intInsertRelations = 1; $intCheck = 1; } return $intCheck; } /** * Inserts a relation type 5 (1:1 check command) * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation5(string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Extract data values */ $arrCommand = explode('!', $strValue); $strValue = $arrCommand[0]; /* Define variables */ $intSlaveId = 0; if (strtolower(trim($strValue)) === 'null') { /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = -1 WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } else { /* Decompose data values */ $arrValues = explode(',', $strValue); /* Process data values */ foreach ($arrValues as $elem) { /* Does the entry already exist? */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName1'] . '` ' . 'WHERE `' . $arrRelData['target1'] . "` = '" . $elem . "' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; } if ($intSlaveId === 0) { /* Insert a temporary value in target table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "` = '" . $elem . "', `config_id`=" . $this->intDomainId . ', ' . "`active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; } /* Update data in master table */ $arrCommand[0] = $intSlaveId; $strValue = implode('!', $arrCommand); $strSQL = 'UPDATE `' . $strDataTable . '` ' . 'SET `' . $arrRelData['fieldName'] . "`='" . $this->myDBClass->realEscape($strValue) . "' " . 'WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /** * Inserts a relation type 1 (1:1) * @param string $strKey Data field name * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data * @param array $arrImportData Import Data */ public function writeRelation1(string $strKey, string $strValue, int $intDataId, string $strDataTable, array $arrRelData, array $arrImportData): void { /* Define variables */ $intSlaveId = 0; if (strtolower(trim($strValue)) === 'null') { /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = -1 WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } else { /* Decompose data value */ $arrValues = explode(',', $strValue); /* Process data values */ foreach ($arrValues as $elem) { $strWhere = ''; $strLink = ''; $strAdd = ''; /* Special processing for serviceextinfo */ if (($strDataTable === 'tbl_serviceextinfo') && ($strKey === 'service_description')) { $strLink = 'LEFT JOIN `tbl_lnkServiceToHost` on `tbl_service`.`id`=`idMaster` ' . 'LEFT JOIN `tbl_host` ON `idSlave`=`tbl_host`.`id`'; $strWhere = "AND `tbl_host`.`host_name`='" . $arrImportData['host_name']['value'] . "'"; } /* Does the value already exist? */ $strSQL = 'SELECT `' . $arrRelData['tableName1'] . '`.`id` FROM `' . $arrRelData['tableName1'] . "` $strLink " . 'WHERE `' . $arrRelData['target1'] . "` = '" . $elem . "' $strWhere AND " . '`' . $arrRelData['tableName1'] . "`.`active`='1' AND " . '`' . $arrRelData['tableName1'] . '`.`config_id`=' . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; } if ($intSlaveId === 0) { /* Insert a temporary value */ if (($strDataTable === 'tbl_serviceextinfo') && ($arrRelData['tableName1'] === 'tbl_service')) { $strAdd = "`config_name`='imp_tmp_by_serviceextinfo',"; } /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "` = '" . $elem . "', " . "$strAdd `config_id`=" . $this->intDomainId . ", `active`='0', " . '`last_modified`=NOW()'; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; /* Special processing for serviceextinfo */ if (($strDataTable === 'tbl_serviceextinfo') && ($strKey === 'service_description')) { $strSQL = 'SELECT `id` FROM `tbl_host` ' . "WHERE `host_name`='" . $arrImportData['host_name']['value'] . "'"; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $strSQL = 'INSERT INTO `tbl_lnkServiceToHost` ' . "SET `idMaster` = '" . $intSlaveId . "', `idSlave` = '" . $strId . "'"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $strSQL = "UPDATE `tbl_service` SET `host_name`=0 WHERE `id`='" . $intSlaveId . "'"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = ' . $intSlaveId . ' ' . 'WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /** * Inserts a relation type 2 (1:n) * @param string $strKey Data field name * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation2(string $strKey, string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Does a tploption field exist? */ /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM `' . $strDataTable . '` WHERE `id` = ' . $intDataId; $this->myDBClass->hasSingleDataset($strSQL, $arrDataset); $strFieldName = $arrRelData['fieldName'] . '_tploptions'; if (isset($arrDataset[$strFieldName])) { $intTplOption = 1; } else { $intTplOption = 0; } /* Delete data from link table */ /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $arrRelData['linkTable'] . '` WHERE `idMaster` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Define variables */ if (strtolower(trim($strValue)) === 'null') { /* Update data in master table */ if ($intTplOption === 1) { $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = 0, ' . '`' . $arrRelData['fieldName'] . '_tploptions` = 1 WHERE `id` = ' . $intDataId; } else { $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = 0 WHERE `id` = ' . $intDataId; } $this->myDBClass->insertData($strSQL); } else { if (0 === strpos(trim($strValue), '+')) { $intOption = 0; $strValue = str_replace('+', '', $strValue); } else { $intOption = 2; } /* Decompose data value */ $arrValues = explode(',', $strValue); if (substr_count($strValue, '*') !== 0) { $intRelValue = 2; } else { $intRelValue = 1; } /* Process data values */ foreach ($arrValues as $elem) { if ($elem !== '*') { $strWhere = ''; $strLink = ''; /* Exclude values */ if (0 === strpos($elem, '!')) { $intExclude = 1; $elem = substr($elem, 1); } else { $intExclude = 0; } if ((($strDataTable === 'tbl_servicedependency') || ($strDataTable === 'tbl_serviceescalation')) && (substr_count($strKey, 'service') !== 0) && (substr_count($strKey, 'group') === 0)) { $strLink = 'LEFT JOIN `tbl_lnkServiceToHost` on `id`=`idMaster`'; if (substr_count($strKey, 'depend') !== 0) { $strWhere = 'AND `idSlave` IN (' . substr($this->strList1, 0, -1) . ')'; } else { $strWhere = 'AND `idSlave` IN (' . substr($this->strList2, 0, -1) . ')'; } } /* Does the entry already exist? */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName1'] . "` $strLink " . 'WHERE `' . $arrRelData['target1'] . "` = '" . $elem . "' $strWhere AND " . '`config_id`=' . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; } else { $intSlaveId = 0; } if (($intSlaveId === 0) && ($elem !== '*')) { /* Insert a temporary value to the target table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "`='" . $elem . "', " . '`config_id`=' . $this->intDomainId . ", `active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; } /* Insert relations */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' . 'SET `idMaster` = ' . $intDataId . ', `idSlave` = ' . $intSlaveId . ', `exclude`=' . $intExclude; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Keep values */ if (($strDataTable === 'tbl_servicedependency') || ($strDataTable === 'tbl_serviceescalation')) { $strTemp = ''; if (($strKey === 'dependent_host_name') || ($strKey === 'host_name')) { $strTemp .= $intSlaveId . ','; } elseif (($strKey === 'dependent_hostgroup_name') || ($strKey === 'hostgroup_name')) { $arrDataHostgroups = array(); $intDCHostgroups = 0; $strSQL = 'SELECT DISTINCT `id` FROM `tbl_host` ' . 'LEFT JOIN `tbl_lnkHostToHostgroup` ON `id`=`tbl_lnkHostToHostgroup`.`idMaster` ' . 'LEFT JOIN `tbl_lnkHostgroupToHost` ON `id`=`tbl_lnkHostgroupToHost`.`idSlave` ' . "WHERE (`tbl_lnkHostgroupToHost`.`idMaster` = $intSlaveId " . "OR `tbl_lnkHostToHostgroup`.`idSlave` = $intSlaveId) " . "AND `active`='1' AND `config_id`=" . $this->intDomainId; $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrDataHostgroups, $intDCHostgroups); if ($booReturn && ($intDCHostgroups !== 0)) { foreach ($arrDataHostgroups as $elem2) { $strTemp .= $elem2['id'] . ','; } } } if (substr_count($strKey, 'dependent') !== 0) { $this->strList1 .= $strTemp; } else { $this->strList2 .= $strTemp; } } } /* Update field values in master table */ if ($intTplOption === 1) { $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . "`=$intRelValue, " . '`' . $arrRelData['fieldName'] . '_tploptions` = ' . $intOption . ' WHERE `id` = ' . $intDataId; } else { $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . "`=$intRelValue " . 'WHERE `id` = ' . $intDataId; } $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /** * Inserts a relation type 3 (templates) * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation3(string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Define variables */ $intSlaveId = 0; $intTable = 0; $intSortNr = 1; if (strtolower(trim($strValue)) === 'null') { /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = 0, ' . '`' . $arrRelData['fieldName'] . '_tploptions` = 1 WHERE `id` = ' . $intDataId; $this->myDBClass->insertData($strSQL); } else { if (0 === strpos(trim($strValue), '+')) { $intOption = 0; $strValue = str_replace('+', '', $strValue); } else { $intOption = 2; } /* Remove old relations */ /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $arrRelData['linkTable'] . '` WHERE `idMaster` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Decompose data value */ $arrValues = explode(',', $strValue); /* Process data values */ foreach ($arrValues as $elem) { /* Does the template already exist? (table 1) */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName1'] . '` ' . 'WHERE `' . $arrRelData['target1'] . "` = '" . $elem . "' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; $intTable = 1; } if ($intSlaveId === 0) { /* Does the template already exist? (table 2) */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName2'] . '` ' . 'WHERE `' . $arrRelData['target2'] . "` = '" . $elem . "' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; $intTable = 2; } } if ($intSlaveId === 0) { /* Insert a temporary value to the target table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "` = '" . $elem . "', `config_id`=" . $this->intDomainId . ', ' . "`active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; $intTable = 1; } /* Insert relations */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' . 'SET `idMaster` = ' . $intDataId . ', `idSlave`=' . $intSlaveId . ', `idSort`=' . $intSortNr . ', ' . '`idTable` = ' . $intTable; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSortNr++; $intSlaveId = 0; /* Update field data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `' . $arrRelData['fieldName'] . '` = 1, ' . '`' . $arrRelData['fieldName'] . '_tploptions` = ' . $intOption . ' WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /** * Inserts a relation type 4 (free variables) * @param string $strKey Data field name * @param string $strValue Data value * @param int $intDataId Data ID * @param int $intRemoveData 0 = do not remove data / 1 = do remove data * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data * @return int 0 = successful / 1 = error */ public function writeRelation4(string $strKey, string $strValue, int $intDataId, int $intRemoveData, string $strDataTable, array $arrRelData): int { /* Define variables */ $intReturn = 0; /* Remove empty variables */ if (($strKey === '') || ($strValue === '')) { $intReturn = 1; } /* Remove NagiosQL variables */ if ($strKey === '_NAGIOSQL_CONFIG_NAME') { $intReturn = 1; } /* Remove old variables */ if ($intRemoveData === 1) { /** @noinspection SqlResolve */ $strSQL = 'SELECT * FROM ' . $arrRelData['linkTable'] . ' WHERE idMaster=' . $intDataId; $booResult = $this->myDBClass->hasDataArray($strSQL, $arrLinkData, $intLinkCount); if ($booResult && ($intLinkCount !== 0)) { /** @var array $arrLinkData */ foreach ($arrLinkData as $elem) { $strSQL1 = 'DELETE FROM tbl_variabledefinition WHERE id=' . $elem['idSlave']; $booResult = $this->myDBClass->insertData($strSQL1); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /** @noinspection SqlResolve */ $strSQL2 = 'DELETE FROM ' . $arrRelData['linkTable'] . ' WHERE idMaster=' . $elem['idMaster']; $booResult = $this->myDBClass->insertData($strSQL2); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } } /* Insert free Variables */ if ($intReturn === 0) { /* Insert values to the table */ $strSQL = "INSERT INTO `tbl_variabledefinition` SET `name` = '" . addslashes($strKey) . "', " . "`value` = '" . addslashes($strValue) . "', `last_modified`=now()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; /* Insert relations to the table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' . 'SET `idMaster` = ' . $intDataId . ', `idSlave` = ' . $intSlaveId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` SET `use_variables` = 1 WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } return $intReturn; } /** * Inserts a relation type 5 (1:n:n service groups) * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation6(string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Define variables */ $intSlaveIdH = 0; $intSlaveIdHG = 0; /* Decompose data value */ $arrValues = explode(',', $strValue); /* Remove data from link table */ /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $arrRelData['linkTable'] . '` WHERE `idMaster` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Check the sum of elements */ if (count($arrValues) % 2 !== 0) { $this->strErrorMessage .= translate('Error: incorrect number of arguments - cannot import service group ' . 'members') . '::'; } else { /* Process data values */ $intCounter = 1; foreach ($arrValues as $elem) { if ($intCounter % 2 === 0) { /* Does the host entry already exist? */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName1'] . '` ' . 'WHERE `' . $arrRelData['target1'] . "` = '" . $strValue . "' AND `active`='1' " . 'AND `config_id`=' . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveIdH = (int)$strId; } /* Does a hostgroup entry already exist? */ if ($intSlaveIdH === 0) { $strSQL = "SELECT `id` FROM `tbl_hostgroup` WHERE `hostgroup_name` = '" . $strValue . "' " . "AND `active`='1' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveIdHG = (int)$strId; } } if (($intSlaveIdH === 0) && ($intSlaveIdHG === 0)) { /* Insert a temporary value in table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "` = '" . $strValue . "', " . '`config_id`=' . $this->intDomainId . ", `active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveIdH = $this->myDBClass->intLastId; } /* Does the service entry already exist? */ if ($intSlaveIdH !== 0) { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName2'] . '` ' . 'LEFT JOIN `tbl_lnkServiceToHost` ON `id` = `idMaster` ' . 'WHERE `' . $arrRelData['target2'] . "` = '" . $elem . "' AND `idSlave` = " . $intSlaveIdH . ' ' . 'AND `config_id`=' . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId === '') { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName2'] . '` ' . 'LEFT JOIN `tbl_lnkServiceToHostgroup` ON ' . '`id`=`tbl_lnkServiceToHostgroup`.`idMaster` ' . 'LEFT JOIN `tbl_lnkHostgroupToHost` ON ' . '`tbl_lnkHostgroupToHost`.`idMaster`=`tbl_lnkServiceToHostgroup`.`idSlave` ' . 'WHERE `' . $arrRelData['target2'] . "` = '" . $elem . "' AND " . '`tbl_lnkHostgroupToHost`.`idSlave` = ' . $intSlaveIdH . ' AND ' . "`active`='1' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); } if ($strId === '') { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName2'] . '` ' . 'LEFT JOIN `tbl_lnkServiceToHostgroup` ON ' . '`id` = `tbl_lnkServiceToHostgroup`.`idMaster` ' . 'LEFT JOIN `tbl_lnkHostToHostgroup` ON ' . '`tbl_lnkHostToHostgroup`.`idSlave`=`tbl_lnkServiceToHostgroup`.`idSlave` ' . 'WHERE `' . $arrRelData['target2'] . "` = '" . $elem . "' AND " . '`tbl_lnkHostToHostgroup`.`idMaster` = ' . $intSlaveIdH . ' AND ' . "`active`='1' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); } } elseif ($intSlaveIdHG !== 0) { /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName2'] . '` ' . 'LEFT JOIN `tbl_lnkServiceToHostgroup` ON `id` = `idMaster` ' . 'WHERE `' . $arrRelData['target2'] . "` = '" . $elem . "' AND `idSlave`=" . $intSlaveIdHG . ' ' . "AND `active`='1' AND `config_id`=" . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); } if ($strId !== '') { $intSlaveIdS = (int)$strId; } else { $intSlaveIdS = 0; } if ($intSlaveIdS === 0) { /* Insert a temporary value in table */ $intHostName = 0; $intHostgroupName = 0; if ($intSlaveIdH !== 0) { $intHostName = 1; } elseif ($intSlaveIdHG !== 0) { $intHostgroupName = 1; } /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName2'] . '` ' . "SET `config_name`='imp_tmp_by_servicegroup', `host_name`=$intHostName, " . "`hostgroup_name`=$intHostgroupName, `" . $arrRelData['target2'] . "` = '" . $elem . "', " . '`config_id`=' . $this->intDomainId . ", `active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveIdS = $this->myDBClass->intLastId; /* Make a relation from temp service to host / hostgroup */ if ($intSlaveIdH !== 0) { $strSQL = 'INSERT INTO `tbl_lnkServiceToHost` ' . "SET `idMaster`='" . $intSlaveIdS . "', `idSlave`=" . $intSlaveIdH . ", `exclude`='0'"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } elseif ($intSlaveIdHG !== 0) { $strSQL = 'INSERT INTO `tbl_lnkServiceToHostgroup` ' . "SET `idMaster`='" . $intSlaveIdS . "', `idSlave`=" . $intSlaveIdHG . ', ' . "`exclude`='0'"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } /* Insert relation */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' . 'SET `idMaster`=' . $intDataId . ', `idSlaveH`=' . $intSlaveIdH . ', `idSlaveS`=' . $intSlaveIdS; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Update data in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` ' . 'SET `' . $arrRelData['fieldName'] . '` = 1 WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } else { $strValue = $elem; } $intCounter++; } } } /** * Inserts a relation type 7 (1:n:str) * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation7(string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Delete data from link table */ /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $arrRelData['linkTable'] . '` WHERE `idMaster` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Decompose data value */ $arrValues = explode(',', $strValue); if (substr_count($strValue, '*') !== 0) { $intRelValue = 2; } else { $intRelValue = 1; } /* Process data values */ foreach ($arrValues as $elem) { if ($elem !== '*') { $strWhere = ''; /* Exclude values */ if (0 === strpos($elem, '!')) { $intExclude = 1; $elem = substr($elem, 1); } else { $intExclude = 0; } /* Does the entry already exist? */ /** @noinspection SqlResolve */ $strSQL = 'SELECT `id` FROM `' . $arrRelData['tableName1'] . '` ' . 'WHERE `' . $arrRelData['target1'] . "`='" . $elem . "' $strWhere " . 'AND `config_id`=' . $this->intDomainId; $strId = $this->myDBClass->getFieldData($strSQL); if ($strId !== '') { $intSlaveId = (int)$strId; } else { $intSlaveId = 0; } if (($intSlaveId === 0) && ($elem !== '*')) { /* Insert a temporary value to the target table */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['tableName1'] . '` ' . 'SET `' . $arrRelData['target1'] . "` = '" . $elem . "', `host_name`=2, `hostgroup_name`=2, " . "`config_name`='imp_tmp_by_servicedependency', `config_id`=" . $this->intDomainId . ', ' . "`active`='0', `last_modified`=NOW()"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $intSlaveId = $this->myDBClass->intLastId; } /* Insert relations */ /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO `' . $arrRelData['linkTable'] . '` ' . 'SET `idMaster` = ' . $intDataId . ', `idSlave` = ' . $intSlaveId . ", `strSlave`='" . $elem . "', " . '`exclude`=' . $intExclude; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } /* Update field values in master table */ $strSQL = 'UPDATE `' . $strDataTable . '` ' . 'SET `' . $arrRelData['fieldName'] . "` = $intRelValue WHERE `id` = " . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } } /** * Inserts a relation type 8 (service and servicetemplate parents - 1:service:host) * @param string $strValue Data value * @param int $intDataId Data ID * @param string $strDataTable Data table (Master) * @param array $arrRelData Relation data */ public function writeRelation8(string $strValue, int $intDataId, string $strDataTable, array $arrRelData): void { /* Decompose data value */ $arrValues = explode(',', $strValue); /* Delete data from link table */ /** @noinspection SqlResolve */ $strSQL = 'DELETE FROM `' . $arrRelData['linkTable'] . '` WHERE `idMaster` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } /* Check the sum of elements */ if (count($arrValues) % 2 !== 0) { $this->strErrorMessage .= translate('Error: incorrect number of arguments - cannot import service parent ' . 'members') . '::'; } else { /* Process data values */ $intCounter = 1; $strHostName = ''; foreach ($arrValues as $elem) { if ($intCounter % 2 === 0) { $strServiceName = $elem; if (($strServiceName !== '') && ($strHostName !== '')) { $strSQL = 'SELECT tbl_service.id AS id_1, C.id AS id_2, D.id AS id_3, E.id AS id_4 ' . 'FROM tbl_service ' . 'LEFT JOIN tbl_lnkServiceToHost ON tbl_service.id=tbl_lnkServiceToHost.idMaster ' . 'LEFT JOIN tbl_lnkServiceToHostgroup ' . 'ON tbl_service.id=tbl_lnkServiceToHostgroup.idMaster ' . 'LEFT JOIN tbl_lnkHostgroupToHost AS A ON tbl_lnkServiceToHostgroup.idSlave=A.idMaster ' . 'LEFT JOIN tbl_lnkHostToHostgroup AS B ON tbl_lnkServiceToHostgroup.idSlave=B.idSlave ' . 'LEFT JOIN tbl_host AS C ON A.idSlave=C.id ' . 'LEFT JOIN tbl_host AS D ON B.idMaster=D.id ' . 'LEFT JOIN tbl_host AS E ON tbl_lnkServiceToHost.idSlave=E.id ' . "WHERE tbl_service.service_description='" . $strServiceName . "' " . "AND (C.host_name='" . $strHostName . "' OR D.host_name='" . $strHostName . "' " . "OR E.host_name='" . $strHostName . "')"; $booResult = $this->myDBClass->hasDataArray($strSQL, $arrDataset, $intCount); if ($booResult && ($intCount === 1)) { $intServiceId = 0; $intHostId = 0; $intId1 = $arrDataset[0]['id_1']; $intId2 = $arrDataset[0]['id_2']; $intId3 = $arrDataset[0]['id_3']; $intId4 = $arrDataset[0]['id_4']; if (($intId1 !== null) && ($intId1 !== 0) && ($intServiceId === 0)) { $intServiceId = (int)$intId1; } $intHostSum = 0; if (($intId2 !== null) && ($intId2 !== 0) && ($intHostId === 0)) { $intHostId = (int)$intId2; $intHostSum += $intHostId; } if (($intId3 !== null) && ($intId3 !== 0) && ($intHostId === 0)) { $intHostId = (int)$intId3; $intHostSum += $intHostId; } if (($intId4 !== null) && ($intId4 !== 0) && ($intHostId === 0)) { $intHostId = (int)$intId4; $intHostSum += $intHostId; } if (($intHostId === $intHostSum) && ($intServiceId !== 0) && ($intHostId !== 0)) { /** @noinspection SqlResolve */ $strSQL = 'INSERT INTO ' . $arrRelData['linkTable'] . ' ' . "SET idMaster=$intDataId, idSlave=$intServiceId, idHost=$intHostId"; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } $strSQL = 'UPDATE `' . $strDataTable . '` ' . 'SET `' . $arrRelData['fieldName'] . '` = 1 WHERE `id` = ' . $intDataId; $booResult = $this->myDBClass->insertData($strSQL); if ($booResult === false) { $this->strErrorMessage .= $this->myDBClass->strErrorMessage; } } else { $this->strErrorMessage .= translate('Error: cannot import the service parent member ') . $strServiceName . '-' . $strHostName . '. ' . translate('This combination is not unique!') . '::'; } } else { $this->strErrorMessage .= translate('Error: cannot import the service parent member ') . $strServiceName . '-' . $strHostName . '. ' . translate('This combination is not unique or does not exist!') . '::'; } } } else { $strHostName = $elem; } $intCounter++; } } } }