arrSettings = $arrSession['SETS']; } if (isset($arrSession['domain'])) { $this->intDomainId = $arrSession['domain']; } $this->arrSession = $arrSession; } /** * Get domain configuration parameters. * @param string $strConfigItem Configuration key * @param string $strValue Configuration value (by reference) * @return int 0 = successful / 1 = error */ public function getDomainData($strConfigItem, &$strValue) { // Variable definition $intReturn = 0; // Request domain data from database $strSQL = 'SELECT `' .$strConfigItem. '` FROM `tbl_datadomain` WHERE `id` = ' .$this->intDomainId; $strValue = $this->myDBClass->getFieldData($strSQL); if ($strValue == '') { $intReturn = 1; } return $intReturn; } /** * Get last modification date of a database table and any configuration files inside a directory. * @param string $strTableName Name of the database table * @param string $strConfigName Name of the configuration file * @param int $intDataId ID of the dataset for service table * @param array $arrTimeData Array with the timestamps of the files and the DB table (by reference) * @param int $intTimeInfo Time status value (by reference) * 0 = all files are newer than the database item * 1 = some file are older than the database item * 2 = one file is missing * 3 = any files are missing * 4 = no configuration targets defined * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ public function lastModifiedDir($strTableName, $strConfigName, $intDataId, &$arrTimeData, &$intTimeInfo) { // Variable definitions $intReturn = 0; // Create file name $strFileName = $strConfigName. '.cfg'; // Get table times $strActive = 0; $arrTimeData = array(); $arrTimeData['table'] = 'unknown'; // Clear status cache clearstatcache(); // Get last change on dataset if ($strTableName == 'tbl_host') { $strSQL1 = "SELECT DATE_FORMAT(`last_modified`,'%Y-%m-%d %H:%i:%s') FROM `tbl_host` ". "WHERE `host_name`='$strConfigName' AND `config_id`=".$this->intDomainId; $strSQL2 = "SELECT `active` FROM `tbl_host` WHERE `host_name`='$strConfigName' ". 'AND `config_id`=' .$this->intDomainId; $arrTimeData['table'] = $this->myDBClass->getFieldData($strSQL1); $strActive = $this->myDBClass->getFieldData($strSQL2); } elseif ($strTableName == 'tbl_service') { $strSQL1 = "SELECT DATE_FORMAT(`last_modified`,'%Y-%m-%d %H:%i:%s') FROM `tbl_service` ". "WHERE `id`='$intDataId' AND `config_id`=".$this->intDomainId; $strSQL2 = "SELECT * FROM `$strTableName` WHERE `config_name`='$strConfigName' ". 'AND `config_id`=' .$this->intDomainId." AND `active`='1'"; $arrTimeData['table'] = $this->myDBClass->getFieldData($strSQL1); $intServiceCount = $this->myDBClass->countRows($strSQL2); if ($intServiceCount != 0) { $strActive = 1; } } else { $intReturn = 1; } // Get config sets $arrConfigId = array(); $strTarget = ''; $strBaseDir = ''; $intTimeInfo = -1; $intRetVal2 = $this->getConfigTargets($arrConfigId); if ($intRetVal2 == 0) { foreach ($arrConfigId as $intConfigId) { // Get configuration file data $this->getConfigValues($intConfigId, 'target', $strTarget); // Get last change on dataset if ($strTableName == 'tbl_host') { $this->getConfigValues($intConfigId, 'hostconfig', $strBaseDir); } elseif ($strTableName == 'tbl_service') { $this->getConfigValues($intConfigId, 'serviceconfig', $strBaseDir); } $arrTimeData[$strTarget] = 'unknown'; $intFileStampTemp = -1; // Get time data $intReturn = $this->getFileDate( $intConfigId, $strFileName, $strBaseDir, $intFileStampTemp, $arrTimeData[$strTarget] ); if (($intFileStampTemp == 0) && ($strActive == '1')) { $intTimeInfo = 2; } if (($strActive == '1') && (strtotime($arrTimeData['table']) > $intFileStampTemp)) { $intTimeInfo = 1; } } $intItems = \count($arrTimeData) - 1; $intUnknown = 0; $intUpToDate = 0; foreach ($arrTimeData as $key) { if ($key == 'unknown') { $intUnknown++; } if (strtotime($arrTimeData['table']) < strtotime($key)) { $intUpToDate++; } } if ($intUnknown == $intItems) { $intTimeInfo = 3; } if ($intUpToDate == $intItems) { $intTimeInfo = 0; } } else { $intTimeInfo = 4; } return $intReturn; } /** * Get configuration target IDs * @param array $arrConfigId Configuration target IDs (by reference) * @return int 0 = successful / 1 = error */ public function getConfigTargets(&$arrConfigId) { // Variable definition $arrData = array(); $arrConfigId = array(); $intDataCount = 0; $intReturn = 1; // Request target ID $strSQL = 'SELECT `targets` FROM `tbl_datadomain` WHERE `id`=' .$this->intDomainId; $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount); if ($booReturn && ($intDataCount != 0)) { foreach ($arrData as $elem) { $arrConfigId[] = $elem['targets']; } $intReturn = 0; } return $intReturn; } /** * Get configuration domain values * @param int $intConfigId Configuration ID * @param string $strConfigKey Configuration key * @param string $strValue Configuration value (by reference) * @return int 0 = successful / 1 = error */ public function getConfigValues($intConfigId, $strConfigKey, &$strValue) { // Define variables $intReturn = 1; // Read database $strSQL = 'SELECT `' .$strConfigKey. '` FROM `tbl_configtarget` WHERE `id`=' .$intConfigId; $strValue = $this->myDBClass->getFieldData($strSQL); if ($strValue != '') { $intReturn = 0; } return $intReturn; } /** * Get last modification date of a configuration file. * @param int $intConfigId Configuration ID * @param string $strFile Configuration file name * @param string $strBaseDir Base directory with configuration file * @param int|bool $intFileStamp File timestamp (by reference) * @param string $strTimeData Human readable string of file time stamp (by reference) * @return int 0 = successful / 1 = error */ public function getFileDate($intConfigId, $strFile, $strBaseDir, &$intFileStamp, &$strTimeData) { $strMethod = 1; $intReturn = 0; // Get configuration file data $this->getConfigValues($intConfigId, 'method', $strMethod); $strTimeData = 'unknown'; $intFileStamp = -1; // Lokal file system if (($strMethod == 1) && file_exists($strBaseDir. '/' .$strFile)) { $intFileStamp = filemtime($strBaseDir. '/' .$strFile); $strTimeData = date('Y-m-d H:i:s', $intFileStamp); } elseif ($strMethod == 2) { // FTP file system // Check connection $intReturn = $this->getFTPConnection($intConfigId); if ($intReturn == 0) { $intFileStamp = ftp_mdtm($this->resConnectId, $strBaseDir . '/' . $strFile); if ($intFileStamp != -1) { $strTimeData = date('Y-m-d H:i:s', $intFileStamp); } } } elseif ($strMethod == 3) { // SSH file system // Check connection $intReturn = $this->getSSHConnection($intConfigId); // Check file date $strFilePath = str_replace('//', '/', $strBaseDir.'/'.$strFile); $strCommand = 'ls '.$strFilePath; $arrResult = array(); if (($intReturn == 0) && ($this->sendSSHCommand($strCommand, $arrResult) == 0) && isset($arrResult[0]) && ($arrResult[0] == $strFilePath)) { $arrInfo = ssh2_sftp_stat($this->resSFTP, $strFilePath); $intFileStamp = $arrInfo['mtime']; if ($intFileStamp != -1) { $strTimeData = date('Y-m-d H:i:s', $intFileStamp); } } } return $intReturn; } /** * Open an FTP connection * @param int $intConfigID Configuration ID * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ public function getFTPConnection($intConfigID) { // Define variables $intReturn = 0; $arrError = array(); // Already connected? if (empty($this->resConnectId) || !\is_resource($this->resConnectId) || ($this->resConnectType != 'FTP')) { // Define variables $booLogin = false; $this->getConfigValues($intConfigID, 'server', $strServer); $this->getConfigValues($intConfigID, 'ftp_secure', $intFtpSecure); // Set up basic connection $this->resConnectServer = $strServer; $this->resConnectType = 'FTP'; // Secure FTP? if ($intFtpSecure == 1) { $this->resConnectId = ftp_ssl_connect($strServer); } else { $this->resConnectId = ftp_connect($strServer); } // Login with username and password if ($this->resConnectId) { $this->getConfigValues($intConfigID, 'user', $strUser); $this->getConfigValues($intConfigID, 'password', $strPasswd); $intErrorReporting = error_reporting(); error_reporting('0'); $booLogin = ftp_login($this->resConnectId, $strUser, $strPasswd); $arrError = error_get_last(); error_reporting($intErrorReporting); if ($booLogin == false) { ftp_close($this->resConnectId); $this->resConnectServer = ''; $this->resConnectType = 'none'; $this->resConnectId = null; $intReturn = 1; } else { // Change to PASV mode ftp_pasv($this->resConnectId, true); } } // Check connection if ((!$this->resConnectId) || (!$booLogin)) { $this->myDataClass->writeLog(translate('Connection to remote system failed (FTP connection):') . ' ' . $strServer); $this->processClassMessage(translate('Connection to remote system failed (FTP connection):') . ' ' . $strServer . '::', $this->strErrorMessage); if ($arrError !== null && ($arrError['message'] != '')) { $this->processClassMessage($arrError['message'] . '::', $this->strErrorMessage); } } } return $intReturn; } /** * Open an SSH connection * @param int $intConfigID Configuration ID * @return int 0 = successful / 1 = error * Status messages are stored in class variables */ public function getSSHConnection($intConfigID) { // Define variables $intReturn = 0; $strPasswordNote = ''; // Already connected? if (empty($this->resConnectId) || !\is_resource($this->resConnectId) || ($this->resConnectType != 'SSH')) { // SSH Possible if (!\function_exists('ssh2_connect')) { $this->processClassMessage(translate('SSH module not loaded!'). '::', $this->strErrorMessage); return 1; } // Define variables $booLogin = false; $this->getConfigValues($intConfigID, 'server', $strServer); $this->resConnectServer = $strServer; $this->resConnectType = 'SSH'; $intErrorReporting = error_reporting(); error_reporting(0); $this->resConnectId = ssh2_connect($strServer); $arrError = error_get_last(); error_reporting($intErrorReporting); // Check connection if ($this->resConnectId) { // Login with username and password $this->getConfigValues($intConfigID, 'user', $strUser); $this->getConfigValues($intConfigID, 'password', $strPasswd); $this->getConfigValues($intConfigID, 'ssh_key_path', $strSSHKeyPath); if ($strSSHKeyPath != '') { $strPublicKey = str_replace('//', '/', $strSSHKeyPath.'/id_rsa.pub'); $strPrivatKey = str_replace('//', '/', $strSSHKeyPath.'/id_rsa'); // Check if ssh key file are readable if (!file_exists($strPublicKey) || !is_readable($strPublicKey)) { $this->myDataClass->writeLog(translate('SSH public key does not exist or is not readable') . ' ' . $strSSHKeyPath.$strPublicKey); $this->processClassMessage(translate('SSH public key does not exist or is not readable') . ' ' . $strSSHKeyPath.$strPublicKey. '::', $this->strErrorMessage); $intReturn = 1; } if (!file_exists($strPrivatKey) || !is_readable($strPrivatKey)) { $this->myDataClass->writeLog(translate('SSH private key does not exist or is not readable') . ' ' . $strPrivatKey); $this->processClassMessage(translate('SSH private key does not exist or is not readable'). ' ' . $strPrivatKey. '::', $this->strErrorMessage); $intReturn = 1; } $intErrorReporting = error_reporting(); error_reporting(0); if ($strPasswd == '') { $booLogin = ssh2_auth_pubkey_file( $this->resConnectId, $strUser, $strSSHKeyPath. '/id_rsa.pub', $strSSHKeyPath. '/id_rsa' ); } else { $booLogin = ssh2_auth_pubkey_file( $this->resConnectId, $strUser, $strSSHKeyPath. '/id_rsa.pub', $strSSHKeyPath. '/id_rsa', $strPasswd ); } $arrError = error_get_last(); error_reporting($intErrorReporting); } else { $intErrorReporting = error_reporting(); error_reporting(0); $booLogin = ssh2_auth_password($this->resConnectId, $strUser, $strPasswd); $arrError = error_get_last(); $strPasswordNote = 'If you are using ssh2 with user/password - you have to enable ' . 'PasswordAuthentication in your sshd_config'; error_reporting($intErrorReporting); } } else { $this->myDataClass->writeLog(translate('Connection to remote system failed (SSH2 connection):'). ' ' .$strServer); $this->processClassMessage(translate('Connection to remote system failed (SSH2 connection):'). ' ' .$strServer. '::', $this->strErrorMessage); if ($arrError['message'] != '') { $this->processClassMessage($arrError['message']. '::', $this->strErrorMessage); } $intReturn = 1; } // Check connection if ((!$this->resConnectId) || (!$booLogin)) { $this->myDataClass->writeLog(translate('Connection to remote system failed (SSH2 connection):'). ' ' .$strServer); $this->processClassMessage(translate('Connection to remote system failed (SSH2 connection):') . ' ' .$strServer. '::', $this->strErrorMessage); if ($arrError['message'] != '') { $this->processClassMessage($arrError['message']. '::', $this->strErrorMessage); } if ($strPasswordNote !== null) { $this->processClassMessage($strPasswordNote. '::', $this->strErrorMessage); } $this->resConnectServer = ''; $this->resConnectType = 'none'; $this->resConnectId = null; $intReturn = 1; } else { // Etablish an SFTP connection ressource $this->resSFTP = ssh2_sftp($this->resConnectId); } } return $intReturn; } /** * Sends a command via SSH and stores the result in an array * @param string $strCommand Command string * @param array $arrResult Output as array (by reference) * @param int $intLines Maximal length of output to read * @return int 0 = successful / 1 = error */ public function sendSSHCommand($strCommand, &$arrResult, $intLines = 100) { // Define variables $intCount1 = 0; // empty lines $intCount2 = 0; // data lines $booBreak = false; $this->getConfigTargets($arrConfigSet); // Check connection $intReturn = $this->getSSHConnection($arrConfigSet[0]); if (\is_resource($this->resConnectId)) { // Send command $resStream = ssh2_exec($this->resConnectId, $strCommand.'; echo __END__'); if ($resStream) { // read result stream_set_blocking($resStream, true); stream_set_timeout($resStream, 2); do { $strLine = stream_get_line($resStream, 1024, "\n"); if ($strLine == '') { $intCount1++; } elseif (substr_count($strLine, '__END__') != 1) { $arrResult[] = $strLine; $intReturn = 0; } elseif (substr_count($strLine, '__END__') == 1) { $booBreak = true; } $intCount2++; $arrStatus = stream_get_meta_data($resStream); } while ($resStream && !feof($resStream) && ($intCount1 <= 10) && ($intCount2 <= $intLines) && ($arrStatus['timed_out'] != true) && $booBreak == false); fclose($resStream); // Close SSH connection because of timing problems unset($this->resConnectId); //sleep(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 != '') && (substr_count($strOldMessage, $strNewMessage) == 0)) { $strOldMessage .= $strNewMessage; } elseif ($strOldMessage == '') { $strOldMessage .= $strNewMessage; } } /** * Get configuration target IDs * @param array $arrConfigId Configuration target IDs (by reference) * @return int 0 = successful / 1 = error */ public function getConfigSets(&$arrConfigId) { // Variable definition $arrData = array(); $arrConfigId = array(); $intDataCount = 0; $intReturn = 1; // Request target ID $strSQL = 'SELECT `targets` FROM `tbl_datadomain` WHERE `id`=' .$this->intDomainId; $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount); if ($booReturn && ($intDataCount != 0)) { foreach ($arrData as $elem) { $arrConfigId[] = $elem['targets']; } $intReturn = 0; } return $intReturn; } /** * Moves an existing configuration file to the backup directory and removes then the original file * @param string $strType Type of the configuration file * @param string $strName Name of the configuration file * @param int $intConfigID Configuration target ID * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function moveFile($strType, $strName, $intConfigID) { // Variable definitions $strConfigDir = ''; $strBackupDir = ''; $intReturn = 0; // Get directories switch ($strType) { case 'host': $this->getConfigData($intConfigID, 'hostconfig', $strConfigDir); $this->getConfigData($intConfigID, 'hostbackup', $strBackupDir); break; case 'service': $this->getConfigData($intConfigID, 'serviceconfig', $strConfigDir); $this->getConfigData($intConfigID, 'servicebackup', $strBackupDir); break; case 'basic': $this->getConfigData($intConfigID, 'basedir', $strConfigDir); $this->getConfigData($intConfigID, 'backupdir', $strBackupDir); break; case 'nagiosbasic': $this->getConfigData($intConfigID, 'nagiosbasedir', $strConfigDir); $this->getConfigData($intConfigID, 'backupdir', $strBackupDir); break; default: $intReturn = 1; } if ($intReturn == 0) { // Variable definition $intMethod = 1; $strDate = date('YmdHis'); $strSourceFile = $strConfigDir. '/' .$strName; $strDestinationFile = $strBackupDir. '/' .$strName. '_old_' .$strDate; $booRetVal = false; // Get connection method $this->getConfigData($intConfigID, 'method', $intMethod); // Local file system if ($intMethod == 1) { // Save configuration file if (file_exists($strSourceFile)) { if (is_writable($strBackupDir) && is_writable($strConfigDir)) { copy($strSourceFile, $strDestinationFile); unlink($strSourceFile); } else { $this->processClassMessage(translate('Cannot backup the old file because the permissions are ' .'wrong - destination file: ').$strDestinationFile. '::', $this->strErrorMessage); $intReturn = 1; } } else { $this->processClassMessage(translate('Cannot backup the old file because the source file is ' . 'missing - source file: ') . $strSourceFile . '::', $this->strErrorMessage); $intReturn = 1; } } elseif ($intMethod == 2) { // Remote file (FTP) // Check connection $intReturn = $this->getFTPConnection($intConfigID); if ($intReturn == 0) { $strSourceFile = str_replace('//', '/', $strSourceFile); $strDestinationFile = str_replace('//', '/', $strDestinationFile); // Save configuration file $intFileStamp = ftp_mdtm($this->resConnectId, $strSourceFile); if ($intFileStamp > -1) { $intErrorReporting = error_reporting(); error_reporting(0); $booRetVal = ftp_rename($this->resConnectId, $strSourceFile, $strDestinationFile); error_reporting($intErrorReporting); } else { $this->processClassMessage(translate('Cannot backup the old file because the source file is ' .'missing (remote FTP) - source file: '). $strSourceFile. '::', $this->strErrorMessage); $intReturn = 1; } } if (($booRetVal == false) && ($intReturn == 0)) { $this->processClassMessage(translate('Cannot backup the old file because the permissions are ' .'wrong (remote FTP) - destination file: ').$strDestinationFile. '::', $this->strErrorMessage); $intReturn = 1; } } elseif ($intMethod == 3) { // Remote file (SFTP) // Check connection $intReturn = $this->getSSHConnection($intConfigID); // Save configuration file $arrResult = array(); $strSourceFile = str_replace('//', '/', $strSourceFile); $strDestinationFile = str_replace('//', '/', $strDestinationFile); $strCommand = 'ls '.$strSourceFile; if (($intReturn == 0) && ($this->sendSSHCommand($strCommand, $arrResult) == 0)) { if (isset($arrResult[0]) && $arrResult[0] == $strSourceFile) { $arrInfo = ssh2_sftp_stat($this->resSFTP, $strSourceFile); if ($arrInfo['mtime'] > -1) { $booRetVal = ssh2_sftp_rename($this->resSFTP, $strSourceFile, $strDestinationFile); } } else { $this->processClassMessage(translate('Cannot backup the old file because the source file is ' .'missing (remote SFTP) - source file: '). $strSourceFile. '::', $this->strErrorMessage); $intReturn = 1; } } if (($booRetVal == false) && ($intReturn == 0)) { $this->processClassMessage(translate('Cannot backup the old file because the permissions are ' .'wrong (remote SFTP) - destination file: ').$strDestinationFile. '::', $this->strErrorMessage); $intReturn = 1; } } } return $intReturn; } /** * Remove a file * @param string $strFileName Filename including path to remove * @param int $intConfigID Configuration target ID * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function removeFile($strFileName, $intConfigID) { // Variable definitions $intMethod = 1; $intReturn = 0; $booRetVal = false; // Get connection method $this->getConfigData($intConfigID, 'method', $intMethod); // Local file system if ($intMethod == 1) { // Save configuration file if (file_exists($strFileName)) { if (is_writable($strFileName)) { unlink($strFileName); } else { $this->processClassMessage(translate('Cannot delete the file (wrong permissions)!').'::'. $strFileName. '::', $this->strErrorMessage); $intReturn = 1; } } else { $this->processClassMessage(translate('Cannot delete the file (file does not exist)!').'::'. $strFileName. '::', $this->strErrorMessage); $intReturn = 1; } } elseif ($intMethod == 2) { // Remote file (FTP) // Check connection $intReturn = $this->getFTPConnection($intConfigID); if ($intReturn == 0) { // Save configuration file $intFileStamp = ftp_mdtm($this->resConnectId, $strFileName); if ($intFileStamp > -1) { $intErrorReporting = error_reporting(); error_reporting(0); $booRetVal = ftp_delete($this->resConnectId, $strFileName); error_reporting($intErrorReporting); } else { $this->processClassMessage(translate('Cannot delete file because it does not exists (remote ' . 'FTP)!'). '::', $this->strErrorMessage); $intReturn = 1; } } if ($booRetVal == false) { $this->processClassMessage(translate('Cannot delete file because the permissions are incorrect ' . '(remote FTP)!'). '::', $this->strErrorMessage); $intReturn = 1; } } elseif ($intMethod == 3) { // Remote file (SFTP) // Check connection $intReturn = $this->getSSHConnection($intConfigID); // Save configuration file if (($intReturn == 0) && ($this->sendSSHCommand('ls '.$strFileName, $arrResult) == 0)) { if (isset($arrResult[0])) { $booRetVal = ssh2_sftp_unlink($this->resSFTP, $strFileName); } else { $this->processClassMessage(translate('Cannot delete file because it does not exists (remote ' . 'SSH/SFTP)!'). '::', $this->strErrorMessage); $intReturn = 1; } } if (($intReturn == 0) && ($booRetVal == false)) { $this->processClassMessage(translate('Cannot delete file because the permissions are incorrect ' . '(remote SSH/SFTP)!'). '::', $this->strErrorMessage); $intReturn = 1; } } return $intReturn; } /** * Get configuration domain parameters * @param int $intConfigId Configuration ID * @param string $strConfigItem Configuration key * @param string $strValue Configuration value (by reference) * @return int 0 = successful / 1 = error */ public function getConfigData($intConfigId, $strConfigItem, &$strValue) { $intReturn = 1; $strSQL = 'SELECT `' .$strConfigItem. '` FROM `tbl_configtarget` WHERE `id` = ' .$intConfigId; $strValue = $this->myDBClass->getFieldData($strSQL); if ($strValue != '') { $intReturn = 0; } return $intReturn; } /** * Check a directory for write access * @param string $strPath Physical path * @return int 0 = successful / 1 = error */ public function isDirWriteable($strPath) { // Define variables $intReturnFile = 1; $intReturnDir = 1; $intReturn = 1; // Is input path a file? if (file_exists($strPath) && is_file($strPath)) { $resFile = fopen($strPath, 'ab'); if ($resFile) { $intReturnFile = 0; } } else { $intReturnFile = 0; } if (is_file($strPath)) { $strDirectory = \dirname($strPath); } else { $strDirectory = $strPath; } $strFile = $strDirectory.'/'.uniqid(mt_rand(), true).'.tmp'; // Check writing in directory directly if (is_dir($strDirectory) && is_writable($strDirectory)) { $resFile = fopen($strFile, 'wb'); if ($resFile) { $intReturnDir = 0; unlink($strFile); } } else { $intReturnDir = 0; } if (($intReturnDir == 0) && ($intReturnFile == 0)) { $intReturn = 0; } return $intReturn; } /** * Copy a remote file * @param string $strFileRemote Remote file name * @param int $intConfigID Configuration target id * @param string $strFileLocal Local file name * @param int $intDirection 0 = from remote to local / 1 = from local to remote * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function remoteFileCopy($strFileRemote, $intConfigID, $strFileLocal, $intDirection = 0) { // Variable definitions $intMethod = 3; $intReturn = 0; $arrTemp = array(); // Get method $this->getConfigData($intConfigID, 'method', $intMethod); if ($intMethod == 2) { // Check connection $intReturn = $this->getFTPConnection($intConfigID); if (($intReturn == 0) && ($intDirection == 0)) { $intErrorReporting = error_reporting(); error_reporting(0); if (!ftp_get($this->resConnectId, $strFileLocal, $strFileRemote, FTP_ASCII)) { $this->processClassMessage(translate('Cannot get the remote file (it does not exist or is not ' . 'readable) - remote file: '). $strFileRemote. '::', $this->strErrorMessage); $intReturn = 1; } error_reporting($intErrorReporting); } elseif (($intReturn == 0) && ($intDirection == 1)) { $intErrorReporting = error_reporting(); error_reporting(0); if (!ftp_put($this->resConnectId, $strFileRemote, $strFileLocal, FTP_ASCII)) { $this->processClassMessage(translate('Cannot write the remote file (remote file is not writeable)' . '- remote file: ').$strFileRemote. '::', $this->strErrorMessage); $intReturn = 1; } error_reporting($intErrorReporting); } ftp_close($this->resConnectId); } elseif ($intMethod == 3) { // Remote file (SFTP) $intReturn = $this->getSSHConnection($intConfigID); if (($intReturn == 0) && ($intDirection == 0)) { // Copy file $intErrorReporting = error_reporting(); error_reporting(0); if (!ssh2_scp_recv($this->resConnectId, $strFileRemote, $strFileLocal)) { if ($this->sendSSHCommand('ls ' . $strFileRemote, $arrTemp) != 0) { $this->processClassMessage(translate('Cannot get the remote file (it does not exist or is not ' . 'readable) - remote file: ') .$strFileRemote. '::', $this->strErrorMessage); } else { $this->processClassMessage(translate('Remote file is not readable - remote file: ') . $strFileRemote. '::', $this->strErrorMessage); } $intReturn = 1; } error_reporting($intErrorReporting); } elseif (($intReturn == 0) && ($intDirection == 1)) { if (file_exists($strFileLocal) && is_readable($strFileLocal)) { $intErrorReporting = error_reporting(); error_reporting(0); if (!ssh2_scp_send($this->resConnectId, $strFileLocal, $strFileRemote, 0644)) { $this->processClassMessage(translate('Cannot write a remote file (remote file is not writeable)' .' - remote file: '). $strFileRemote . '::', $this->strErrorMessage); $intReturn = 1; } error_reporting($intErrorReporting); } else { $this->processClassMessage(translate('Cannot copy a local file to remote because the local file '. 'does not exist or is not readable - local file: '). $strFileLocal . '::', $this->strErrorMessage); $intReturn = 1; } } } return $intReturn; } /** * Add files of a given directory to an array * @param string $strSourceDir Source directory * @param string $strIncPattern Include file pattern * @param string $strExcPattern Exclude file pattern * @param array $arrOutput Output array (by reference) * @param string $strErrorMessage Error messages (by reference) */ public function storeDirToArray($strSourceDir, $strIncPattern, $strExcPattern, &$arrOutput, &$strErrorMessage) { // Define variables $arrDir = array(); while (substr($strSourceDir, -1) == '/' or substr($strSourceDir, -1) == "\\") { $strSourceDir = substr($strSourceDir, 0, -1); } $resHandle = opendir($strSourceDir); if ($resHandle === false) { if ($this->intDomainId != 0) { $strErrorMessage .= translate('Could not open directory'). ': ' .$strSourceDir; } } else { $booBreak = true; while ($booBreak) { if (!$arrDir[] = readdir($resHandle)) { $booBreak = false; } } closedir($resHandle); sort($arrDir); /** @var string $file */ foreach ($arrDir as $file) { /** @noinspection StrlenInEmptyStringCheckContextInspection */ if (!preg_match("/^\.{1,2}/", $file) && \strlen($file)) { if (is_dir($strSourceDir. '/' .$file)) { $this->storeDirToArray( $strSourceDir. '/' .$file, $strIncPattern, $strExcPattern, $arrOutput, $strErrorMessage ); } else { if (preg_match('/' .$strIncPattern. '/', $file) && (($strExcPattern == '') || !preg_match('/' .$strExcPattern. '/', $file))) { if (0 === stripos(PHP_OS, 'WIN')) { $strSourceDir=str_replace('/', "\\", $strSourceDir); $arrOutput [] = $strSourceDir."\\".$file; } else { $arrOutput [] = $strSourceDir. '/' .$file; } } } } } } } /** * Determines the dates of the last data table change and the last modification to the configuration files * @param string $strTableName Name of the data table * @param array $arrTimeData Array with time data of table and all config files * @param string $strCheckConfig Information string (text message) * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function lastModifiedFile($strTableName, &$arrTimeData, &$strCheckConfig) { // Variable definitions $intEnableCommon = 0; $arrDataset = array(); $strFileName = ''; $strCheckConfig = ''; $intReturn = 0; // Get configuration filename based on table name $arrConfigData = $this->getConfData(); if (isset($arrConfigData[$strTableName])) { $strFileName = $arrConfigData[$strTableName]['filename']; } else { $intReturn = 1; } // Get table times $arrTimeData = array(); $arrTimeData['table'] = 'unknown'; // Clear status cache clearstatcache(); $intRetVal1 = $this->getDomainData('enable_common', $intEnableCommon); // Get last change of date table if ($intRetVal1 == 0) { $strSQLAdd = ''; if ($intEnableCommon == 1) { $strSQLAdd = 'OR `domainId`=0'; } $strSQL = 'SELECT `updateTime` FROM `tbl_tablestatus` ' . 'WHERE (`domainId`=' .$this->intDomainId." $strSQLAdd) AND `tableName`='".$strTableName."' " . 'ORDER BY `updateTime` DESC LIMIT 1'; $booReturn = $this->myDBClass->hasSingleDataset($strSQL, $arrDataset); if ($booReturn && isset($arrDataset['updateTime'])) { $arrTimeData['table'] = $arrDataset['updateTime']; } else { $strSQL = 'SELECT `last_modified` FROM `' .$strTableName. '` ' . 'WHERE `config_id`=' .$this->intDomainId. ' ORDER BY `last_modified` DESC LIMIT 1'; $booReturn = $this->myDBClass->hasSingleDataset($strSQL, $arrDataset); if (($booReturn == true) && isset($arrDataset['last_modified'])) { $arrTimeData['table'] = $arrDataset['last_modified']; } } } // Get config sets $arrConfigId = array(); $strTarget = ''; $strBaseDir = ''; $intFileStampTemp = 0; $intRetVal2 = $this->getConfigSets($arrConfigId); if ($intRetVal2 == 0) { foreach ($arrConfigId as $intConfigId) { // Get configuration file data $this->getConfigData($intConfigId, 'target', $strTarget); $this->getConfigData($intConfigId, 'basedir', $strBaseDir); // Get time data $intReturn = $this->getFileDate( $intConfigId, $strFileName, $strBaseDir, $intFileStampTemp, $arrTimeData[$strTarget] ); if ($intFileStampTemp != 0 && strtotime($arrTimeData['table']) > $intFileStampTemp) { $strCheckConfig = translate('Warning: configuration file is out of date!'); } if ($arrTimeData[$strTarget] == 'unknown') { $strCheckConfig = translate('Warning: configuration file is out of date!'); } } } else { $strCheckConfig = translate('Warning: no configuration target defined!'); } return $intReturn; } /** * Writes a configuration file including all datasets of a configuration table or returns the output as a text * file for download. (Public master function) * @param string $strTableName Table name * @param int $intMode 0 = Write file to filesystem * 1 = Return Textfile for download test * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function createConfig($strTableName, $intMode = 0) { // Define Variables $intReturn = 0; // Do not create configs in common domain if ($this->intDomainId == 0) { $this->processClassMessage(translate('It is not possible to write config files directly from the common ' . 'domain!'). '::', $this->strErrorMessage); $intReturn = 1; } if ($intReturn == 0) { // Get configuration targets $this->getConfigSets($arrConfigID); if (($arrConfigID != 1) && \is_array($arrConfigID)) { foreach ($arrConfigID as $intConfigID) { $intReturn = $this->writeConfTemplate($intConfigID, $strTableName, $intMode); } } else { $this->processClassMessage(translate('Warning: no configuration target defined!'). '::', $this->strErrorMessage); $intReturn = 1; } } return $intReturn; } /** * Writes a configuration file including one single datasets of a configuration table or returns the output as * a text file for download. * @param string $strTableName Table name * @param int $intDbId Data ID * @param int $intMode 0 = Write file to filesystem * 1 = Return Textfile for download test * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ public function createConfigSingle($strTableName, $intDbId = 0, $intMode = 0) { // Define Variables $arrData = array(); $intDataCount = 0; $setEnableCommon = 0; $intReturn = 0; $strDomainWhere = ' (`config_id`=' .$this->intDomainId. ') '; // Read some settings and informations $this->getDomainData('enable_common', $setEnableCommon); // Variable rewritting if ($setEnableCommon != 0) { $strDomainWhere = str_replace(')', ' OR `config_id`=0)', $strDomainWhere); } // Do not create configs in common domain if ($this->intDomainId == 0) { $this->processClassMessage(translate('It is not possible to write config files directly from the common ' . 'domain!'). '::', $this->strErrorMessage); $intReturn = 1; } if ($intReturn == 0) { if ($intDbId == 0) { $strSQL = 'SELECT * FROM `' .$strTableName."` WHERE $strDomainWhere AND `active`='1' ORDER BY `id`"; } else { $strSQL = 'SELECT * FROM `' .$strTableName."` WHERE $strDomainWhere AND `active`='1' AND `id`=$intDbId"; } $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount); if (($booReturn != false) && ($intDataCount != 0)) { /** @noinspection ForeachInvariantsInspection */ for ($i = 0; $i < $intDataCount; $i++) { // Process form POST variable $strChbName = 'chbId_' .$arrData[$i]['id']; // Check if this POST variable exists or the data ID parameter matches if ((($intDbId != 0) && ($intDbId == $arrData[$i]['id'])) || (filter_input(INPUT_POST, $strChbName) !== null)) { // Get configuration targets $this->getConfigSets($arrConfigID); if (($arrConfigID != 1) && \is_array($arrConfigID)) { foreach ($arrConfigID as $intConfigID) { $intReturn = $this->writeConfTemplate( $intConfigID, $strTableName, $intMode, $arrData, $i ); } } else { $this->processClassMessage(translate('Warning: no configuration target defined!'). '::', $this->strErrorMessage); $intReturn = 1; } } } } else { $this->myDataClass->writeLog(translate('Writing of the configuration failed - no dataset or not ' . 'activated dataset found')); $this->processClassMessage(translate('Writing of the configuration failed - no dataset or not ' . 'activated dataset found'). '::', $this->strErrorMessage); $intReturn = 1; } } return $intReturn; } // PRIVATE functions /** * Determines the configuration data for each database table * @return array filename (configuration file name) * order_field (database order field) */ public function getConfData() { $arrConfData['tbl_timeperiod'] = array('filename' => 'timeperiods.cfg', 'order_field' => 'timeperiod_name'); $arrConfData['tbl_command'] = array('filename' => 'commands.cfg', 'order_field' => 'command_name'); $arrConfData['tbl_contact'] = array('filename' => 'contacts.cfg', 'order_field' => 'contact_name'); $arrConfData['tbl_contacttemplate'] = array('filename' => 'contacttemplates.cfg', 'order_field' => 'template_name'); $arrConfData['tbl_contactgroup'] = array('filename' => 'contactgroups.cfg', 'order_field' => 'contactgroup_name'); $arrConfData['tbl_hosttemplate'] = array('filename' => 'hosttemplates.cfg', 'order_field' => 'template_name'); $arrConfData['tbl_servicetemplate'] = array('filename' => 'servicetemplates.cfg', 'order_field' => 'template_name'); $arrConfData['tbl_hostgroup'] = array('filename' => 'hostgroups.cfg', 'order_field' => 'hostgroup_name'); $arrConfData['tbl_servicegroup'] = array('filename' => 'servicegroups.cfg', 'order_field' => 'servicegroup_name'); $arrConfData['tbl_hostdependency'] = array('filename' => 'hostdependencies.cfg', 'order_field' => 'dependent_host_name'); $arrConfData['tbl_servicedependency'] = array('filename' => 'servicedependencies.cfg', 'order_field' => 'config_name'); $arrConfData['tbl_hostescalation'] = array('filename' => 'hostescalations.cfg', 'order_field' => 'host_name`,`hostgroup_name'); $arrConfData['tbl_serviceescalation'] = array('filename' => 'serviceescalations.cfg', 'order_field' => 'config_name'); $arrConfData['tbl_hostextinfo'] = array('filename' => 'hostextinfo.cfg', 'order_field' => 'host_name'); $arrConfData['tbl_serviceextinfo'] = array('filename' => 'serviceextinfo.cfg', 'order_field' => 'host_name'); return $arrConfData; } /** * Writes a configuration file including all datasets of a configuration table or returns the output as a text * file for download. (Private worker function) * @param int $intConfigID Configuration target ID * @param string $strTableName Table name * @param int $intMode 0 = Write file to filesystem * 1 = Return Textfile for download test * @param array $arrTableData Dataset array for host and services only * @param int $intID Key for dataset array * @return int 0 = successful / 1 = error * Status message is stored in message class variables */ /** @noinspection ArrayTypeOfParameterByDefaultValueInspection */ private function writeConfTemplate($intConfigID, $strTableName, $intMode, $arrTableData = array(), $intID = 0) { // Variable definitions $strSQL = ''; $strOrderField = ''; $strFileString = ''; $arrTplOptions = array('use_preg' => false); $strDomainWhere = ' (`config_id`=' . $this->intDomainId . ') '; $intType = 0; $intReturn = 0; // Read some settings and informations $this->getConfigData($intConfigID, 'utf8_decode', $setUTF8Decode); $this->getDomainData('enable_common', $setEnableCommon); $this->getConfigData($intConfigID, 'version', $intNagiosVersion); $arrConfigData = $this->getConfData(); if (isset($arrConfigData[$strTableName])) { $strFileString = str_replace('.cfg', '', $arrConfigData[$strTableName]['filename']); $strOrderField = $arrConfigData[$strTableName]['order_field']; } // Variable rewritting if ($setEnableCommon != 0) { $strDomainWhere = str_replace(')', ' OR `config_id`=0)', $strDomainWhere); } // Special processing for table host and service $setTemplate = $strFileString. '.tpl.dat'; if (($strTableName == 'tbl_host') || ($strTableName == 'tbl_service')) { // Define variable names based on table name switch ($strTableName) { case 'tbl_host': $strFileString = $arrTableData[$intID]['host_name']; $intDomainId = $arrTableData[$intID]['config_id']; $setTemplate = 'hosts.tpl.dat'; $intType = 1; $strSQL = 'SELECT * FROM `' . $strTableName . "` WHERE `host_name`='$strFileString' " . "AND `active`='1' AND `config_id`=$intDomainId"; break; case 'tbl_service': $strFileString = $arrTableData[$intID]['config_name']; $intDomainId = $arrTableData[$intID]['config_id']; $setTemplate = 'services.tpl.dat'; $intType = 2; $strSQL = 'SELECT * FROM `' . $strTableName . "` WHERE `config_name`='$strFileString' " . "AND `active`='1' AND `config_id`=$intDomainId ORDER BY `service_description`"; break; } } else { $strSQL = 'SELECT * FROM `' .$strTableName."` WHERE $strDomainWhere AND `active`='1' ". 'ORDER BY `' .$strOrderField. '`'; } $strFile = $strFileString. '.cfg'; // Load configuration template file $tplConf = new \HTML_Template_IT($this->arrSettings['path']['base_path']. '/templates/files/'); $tplConf->loadTemplatefile($setTemplate, true, true); $tplConf->setOptions($arrTplOptions); $tplConf->setVariable('CREATE_DATE', date('Y-m-d H:i:s')); $tplConf->setVariable('NAGIOS_QL_VERSION', $this->arrSettings['db']['version']); $tplConf->setVariable('VERSION', $this->getVersionString($intConfigID)); // Write data from configuration table $booReturn = $this->myDBClass->hasDataArray($strSQL, $arrData, $intDataCount); if ($booReturn && ($intDataCount != 0) && ($strFileString != '')) { // Process every data set /** @noinspection ForeachInvariantsInspection */ for ($i = 0; $i < $intDataCount; $i++) { $intDataId = 0; /** @noinspection ForeachSourceInspection */ foreach ($arrData[$i] as $key => $value) { if ($key == 'id') { $intDataId = $value; } if ($key == 'config_name') { $key = '#NAGIOSQL_CONFIG_NAME'; } // UTF8 decoded vaules if ($setUTF8Decode == 1) { $value = utf8_decode($value); } // Pass special fields (NagiosQL data fields not used by Nagios itselves) if ($this->skipEntries($strTableName, $intNagiosVersion, $key, $value) == 1) { continue; } // Get relation data $intSkip = $this->getRelationData($strTableName, $tplConf, $arrData[$i], $key, $value); // Rename field names $this->renameFields($strTableName, $intConfigID, $intDataId, $key, $value, $intSkip); // Inset data field if ($intSkip != 1) { // Insert fill spaces $strFillLen = (30- \strlen($key)); $strSpace = ' '; for ($f = 0; $f < $strFillLen; $f++) { $strSpace .= ' '; } // Write key and value to template $tplConf->setVariable('ITEM_TITLE', $key.$strSpace); // Short values if (($intNagiosVersion != 3) || (\strlen($value) < 800)) { $tplConf->setVariable('ITEM_VALUE', $value); $tplConf->parse('configline'); } else { // Long values $arrValueTemp = explode(',', $value); $strValueNew = ''; $intArrCount = \count($arrValueTemp); $intCounter = 0; $strSpace = ' '; for ($f = 0; $f < 30; $f++) { $strSpace .= ' '; } foreach ($arrValueTemp as $elem) { if (\strlen($strValueNew) < 800) { $strValueNew .= $elem. ','; } else { if (substr($strValueNew, -1) == ',') { $strValueNew = substr($strValueNew, 0, -1); } if ($intCounter < $intArrCount) { $strValueNew .= ",\\"; $tplConf->setVariable('ITEM_VALUE', $strValueNew); $tplConf->parse('configline'); $tplConf->setVariable('ITEM_TITLE', $strSpace); } else { $tplConf->setVariable('ITEM_VALUE', $strValueNew); $tplConf->parse('configline'); $tplConf->setVariable('ITEM_TITLE', $strSpace); } $strValueNew = $elem. ','; } $intCounter++; } if ($strValueNew != '') { if (substr($strValueNew, -1) == ',') { $strValueNew = substr($strValueNew, 0, -1); } $tplConf->setVariable('ITEM_VALUE', $strValueNew); $tplConf->parse('configline'); } } } } // Special processing for time periods if ($strTableName == 'tbl_timeperiod') { $arrDataTime = array(); $strSQLTime = 'SELECT `definition`, `range` ' . 'FROM `tbl_timedefinition` WHERE `tipId` = ' .$arrData[$i]['id']; $booReturn = $this->myDBClass->hasDataArray($strSQLTime, $arrDataTime, $intDataCountTime); if ($booReturn && $intDataCountTime != 0) { foreach ($arrDataTime as $data) { // Skip other values than weekdays in nagios version below 3 if ($intNagiosVersion < 3) { $arrWeekdays = array('monday','tuesday','wednesday','thursday','friday','saturday', 'sunday'); if (!\in_array($data['definition'], $arrWeekdays, true)) { continue; } } // Insert fill spaces $strFillLen = (30- \strlen($data['definition'])); $strSpace = ' '; for ($f = 0; $f < $strFillLen; $f++) { $strSpace .= ' '; } // Write key and value $tplConf->setVariable('ITEM_TITLE', $data['definition'].$strSpace); $tplConf->setVariable('ITEM_VALUE', $data['range']); $tplConf->parse('configline'); } } } // Write configuration set $tplConf->parse('configset'); } } elseif ($booReturn && ($intDataCount == 0) && ($strFileString != '')) { $this->processClassMessage(translate('Error while selecting data from database:') . '::', $this->strErrorMessage); $this->processClassMessage($this->myDBClass->strErrorMessage, $this->strErrorMessage); $intReturn = 1; } else { $this->myDataClass->writeLog(translate('Writing of the configuration failed - no dataset ' . 'or not activated dataset found')); $this->processClassMessage(translate('Writing of the configuration failed - no dataset ' . 'or not activated dataset found'). '::', $this->strErrorMessage); $intReturn = 1; } if ($intMode == 0) { $intReturn = $this->getConfigFile($strFile, $intConfigID, $intType, $resCfgFile, $strCfgFile); if ($intReturn == 0) { $tplConf->parse(); $strContent = $tplConf->get(); $intReturn = $this->writeConfigFile( $strContent, $strFile, $intType, $intConfigID, $resCfgFile, $strCfgFile ); } } elseif ($intMode == 1) { $tplConf->show(); } return $intReturn; } /** * Get Nagios version string * @param int $intConfigID Configuration target ID * @return string Version string */ private function getVersionString($intConfigID) { $arrVersion = array( 'Nagios 2.x config file', 'Nagios 2.9 config file', 'Nagios 3.x config file', 'Nagios 4.x config file' ); $this->getConfigData($intConfigID, 'version', $intVersion); if (($intVersion >= 1) && ($intVersion <= \count($arrVersion))) { $strVersion = $arrVersion[$intVersion - 1]; } else { $strVersion = ''; } return $strVersion; } /** * Skip database values based on Nagios version * @param string $strTableName Table name * @param int $intVersionValue Nagios version value * @param string $key Data key * @param string $value Data value * @return int */ private function skipEntries($strTableName, $intVersionValue, $key, &$value) { // Define variables $arrOption = array(); $intReturn = 0; // Skip common fields $strSpecial = 'id,active,last_modified,access_rights,access_group,config_id,template,nodelete,command_type,'; $strSpecial .= 'import_hash'; // Skip fields of special tables if ($strTableName == 'tbl_hosttemplate') { $strSpecial .= ',parents_tploptions,hostgroups_tploptions,contacts_tploptions'; $strSpecial .= ',contact_groups_tploptions,use_template_tploptions'; } if ($strTableName == 'tbl_servicetemplate') { $strSpecial .= ',host_name_tploptions,hostgroup_name_tploptions,parents_tploptions,contacts_tploptions'; $strSpecial .= ',servicegroups_tploptions,contact_groups_tploptions,use_template_tploptions'; } if ($strTableName == 'tbl_contact') { $strSpecial .= ',use_template_tploptions,contactgroups_tploptions'; $strSpecial .= ',host_notification_commands_tploptions,service_notification_commands_tploptions'; } if ($strTableName == 'tbl_contacttemplate') { $strSpecial .= ',use_template_tploptions,contactgroups_tploptions'; $strSpecial .= ',host_notification_commands_tploptions,service_notification_commands_tploptions'; } if ($strTableName == 'tbl_host') { $strSpecial .= ',parents_tploptions,hostgroups_tploptions,contacts_tploptions'; $strSpecial .= ',contact_groups_tploptions,use_template_tploptions'; } if ($strTableName == 'tbl_service') { $strSpecial .= ',host_name_tploptions,hostgroup_name_tploptions,parents_tploptions'; $strSpecial .= ',servicegroups_tploptions,contacts_tploptions,contact_groups_tploptions'; $strSpecial .= ',use_template_tploptions'; } // Pass fields based on nagios version lower than 3.x if ($intVersionValue < 3) { if ($strTableName == 'tbl_timeperiod') { $strSpecial .= ',use_template,exclude,name'; } if (($strTableName == 'tbl_contact') || ($strTableName == 'tbl_contacttemplate')) { $strSpecial .= ',host_notifications_enabled,service_notifications_enabled,can_submit_commands'; $strSpecial .= ',retain_status_information,retain_nonstatus_information'; $arrOption['host_notification_options'] = ',s'; $arrOption['service_notification_options'] = ',s'; } if ($strTableName == 'tbl_contactgroup') { $strSpecial .= ',contactgroup_members'; } if ($strTableName == 'tbl_hostgroup') { $strSpecial .= ',hostgroup_members,notes,notes_url,action_url'; } if ($strTableName == 'tbl_servicegroup') { $strSpecial .= ',servicegroup_members,notes,notes_url,action_url'; } if ($strTableName == 'tbl_hostdependency') { $strSpecial .= ',dependent_hostgroup_name,hostgroup_name,dependency_period'; } if ($strTableName == 'tbl_hostescalation') { $strSpecial .= ',contacts'; } if ($strTableName == 'tbl_servicedependency') { $strSpecial .= ',dependent_hostgroup_name,hostgroup_name,dependency_period,dependent_servicegroup_name'; $strSpecial .= ',servicegroup_name'; } if ($strTableName == 'tbl_serviceescalation') { $strSpecial .= ',hostgroup_name,contacts,servicegroup_name'; } if (($strTableName == 'tbl_host') || ($strTableName == 'tbl_hosttemplate')) { $strSpecial .= ',initial_state,flap_detection_options,contacts,notes,notes_url,action_url'; $strSpecial .= ',icon_image,icon_image_alt,vrml_image,statusmap_image,2d_coords,3d_coords'; $arrOption['notification_options'] = ',s'; } // Services if (($strTableName == 'tbl_service') || ($strTableName == 'tbl_servicetemplate')) { $strSpecial .= ',initial_state,flap_detection_options,contacts,notes,notes_url,action_url'; $strSpecial .= ',icon_image,icon_image_alt'; $arrOption['notification_options'] = ',s'; } } // Pass fields based on nagios version higher than 2.x if ($intVersionValue > 2) { if ($strTableName == 'tbl_servicetemplate') { $strSpecial .= ',parallelize_check '; } if ($strTableName == 'tbl_service') { $strSpecial .= ',parallelize_check'; } } // Pass fields based on nagios version lower than 4.x if ($intVersionValue < 4) { if (($strTableName == 'tbl_contact') || ($strTableName == 'tbl_contacttemplate')) { $strSpecial .= ',minimum_importance'; } if ($strTableName == 'tbl_host') { $strSpecial .= ',importance'; } if (($strTableName == 'tbl_service') || ($strTableName == 'tbl_servicetemplate')) { $strSpecial .= ',importance,parents'; } } if ($intVersionValue == 1) { $strSpecial .= ''; } // Reduce option values if (array_key_exists($key, $arrOption) && (\count($arrOption) != 0)) { $value = str_replace(array($arrOption[$key], str_replace(',', '', $arrOption[$key])), '', $value); if ($value == '') { $intReturn = 1; } } if ($intReturn == 0) { // Skip entries $arrSpecial = explode(',', $strSpecial); if (($value == '') || \in_array($key, $arrSpecial, true)) { $intReturn = 1; } } if ($intReturn == 0) { // Do not write config data (based on 'skip' option) $strNoTwo = 'active_checks_enabled,passive_checks_enabled,obsess_over_host,check_freshness,'; $strNoTwo .= 'event_handler_enabled,flap_detection_enabled,process_perf_data,retain_status_information,'; $strNoTwo .= 'retain_nonstatus_information,notifications_enabled,parallelize_check,is_volatile,'; $strNoTwo .= 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,'; $strNoTwo .= 'obsess_over_service'; foreach (explode(',', $strNoTwo) as $elem) { if (($key == $elem) && ($value == '2')) { $intReturn = 1; } if (($intVersionValue < 3) && ($key == $elem) && ($value == '3')) { $intReturn = 1; } } } return $intReturn; } /** * Get related data * @param string $strTableName Table name * @param \HTML_Template_IT $resTemplate Template ressource * @param array $arrData Dataset array * @param string $strDataKey Data key * @param string $strDataValue Data value * @return int 0 = use data / 1 = skip data * Status message is stored in message class variables */ private function getRelationData($strTableName, $resTemplate, $arrData, $strDataKey, &$strDataValue) { // Define Variables $intReturn = 0; $intSkipProc = 0; $arrRelations = array(); // Pass function for tbl_command if ($strTableName == 'tbl_command') { $intSkipProc = 1; } // Get relation info and store the value in a class variable (speedup export) if (($intSkipProc == 0) && ($this->strRelTable != $strTableName)) { $intReturn = $this->myDataClass->tableRelations($strTableName, $arrRelations); $this->strRelTable = $strTableName; $this->arrRelData = $arrRelations; } elseif ($intSkipProc == 0) { $arrRelations = $this->arrRelData; $intReturn = 0; } if (($intSkipProc == 0) && (!\is_array($arrRelations)) && (\count($arrRelations) == 0)) { $intSkipProc = 1; $intReturn = 1; } if ($intSkipProc == 0) { // Common domain is enabled? $this->getDomainData('enable_common', $intCommonEnable); if ($intCommonEnable == 1) { $strDomainWhere1 = ' (`config_id`=' . $this->intDomainId . ' OR `config_id`=0) '; } else { $strDomainWhere1 = ' `config_id`=' . $this->intDomainId . ' '; } // Process relations foreach ($arrRelations as $elem) { if ($elem['fieldName'] == $strDataKey) { // Process normal 1:n relations (1 = only data / 2 = including a * value) if (($elem['type'] == 2) && (($strDataValue == 1) || ($strDataValue == 2))) { $intReturn = $this->processRelation1($arrData, $strDataValue, $elem, $strDomainWhere1); // Process normal 1:1 relations } elseif ($elem['type'] == 1) { $intReturn = $this->processRelation2($arrData, $strDataValue, $elem, $strDomainWhere1); // Process normal 1:n relations with special table and idSort (template tables) } elseif (($elem['type'] == 3) && ($strDataValue == 1)) { $intReturn = $this->processRelation3($arrData, $strDataValue, $elem, $strDomainWhere1); // Process special 1:n:str relations with string values (servicedependencies) } elseif (($elem['type'] == 6) && (($strDataValue == 1) || ($strDataValue == 2))) { $intReturn = $this->processRelation4($arrData, $strDataValue, $elem, $strDomainWhere1); // Process special relations for free variables } elseif (($elem['type'] == 4) && ($strDataValue == 1) && ($this->intNagVersion >= 3)) { $intReturn = $this->processRelation5($resTemplate, $arrData, $elem); // Process special relations for service groups } elseif (($elem['type'] == 5) && ($strDataValue == 1)) { $intReturn = $this->processRelation6($arrData, $strDataValue, $elem, $strDomainWhere1); // Process special relations for service parents } elseif (($elem['type'] == 7) && ($strDataValue == 1)) { $intReturn = $this->processRelation7($arrData, $strDataValue, $elem); // Process "*" } elseif ($strDataValue == 2) { $strDataValue = '*'; } else { $intReturn = 1; } } } } return $intReturn; } /** * Rename field names * @param string $strTableName Table name * @param int $intConfigID Configuration target ID * @param int $intDataId Data ID * @param string $key Data key (by reference) * @param string $value Data value (by reference) * @param int $intSkip Skip value (by reference) 1 = skip / 0 = pass */ private function renameFields($strTableName, $intConfigID, $intDataId, &$key, &$value, &$intSkip) { if ($this->intNagVersion == 0) { $this->getConfigData($intConfigID, 'version', $this->intNagVersion); } // Picture path if ($this->strPicPath == 'none') { $this->getConfigData($intConfigID, 'picturedir', $this->strPicPath); } if ($key == 'icon_image') { $value = $this->strPicPath.$value; } if ($key == 'vrml_image') { $value = $this->strPicPath.$value; } if ($key == 'statusmap_image') { $value = $this->strPicPath.$value; } // Tables if ($strTableName == 'tbl_host') { if ($key == 'use_template') { $key = 'use'; } $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'; if (\in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'parents') { $value = $this->checkTpl($value, 'parents_tploptions', 'tbl_host', $intDataId, $intSkip); } if ($key == 'hostgroups') { $value = $this->checkTpl($value, 'hostgroups_tploptions', 'tbl_host', $intDataId, $intSkip); } if ($key == 'contacts') { $value = $this->checkTpl($value, 'contacts_tploptions', 'tbl_host', $intDataId, $intSkip); } if ($key == 'contact_groups') { $value = $this->checkTpl($value, 'contact_groups_tploptions', 'tbl_host', $intDataId, $intSkip); } if ($key == 'use') { $value = $this->checkTpl($value, 'use_template_tploptions', 'tbl_host', $intDataId, $intSkip); } if ($key == 'check_command') { $value = str_replace("\::bang::", "\!", $value); } if ($key == 'check_command') { $value = str_replace('::bang::', "\!", $value); } } if ($strTableName == 'tbl_service') { if ($key == 'use_template') { $key = 'use'; } if ($this->intNagVersion < 2) { if ($key == 'check_interval') { $key = 'normal_check_interval'; } if ($key == 'retry_interval') { $key = 'retry_check_interval'; } } $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'; if (\in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'host_name') { $value = $this->checkTpl($value, 'host_name_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'hostgroup_name') { $value = $this->checkTpl($value, 'hostgroup_name_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'parents') { $value = $this->checkTpl($value, 'parents_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'servicegroups') { $value = $this->checkTpl($value, 'servicegroups_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'contacts') { $value = $this->checkTpl($value, 'contacts_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'contact_groups') { $value = $this->checkTpl($value, 'contact_groups_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'use') { $value = $this->checkTpl($value, 'use_template_tploptions', 'tbl_service', $intDataId, $intSkip); } if ($key == 'check_command') { $value = str_replace("\::bang::", "\!", $value); } if ($key == 'check_command') { $value = str_replace('::bang::', "\!", $value); } } if ($strTableName == 'tbl_hosttemplate') { if ($key == 'template_name') { $key = 'name'; } if ($key == 'use_template') { $key = 'use'; } $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'; if (\in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'parents') { $value = $this->checkTpl($value, 'parents_tploptions', 'tbl_hosttemplate', $intDataId, $intSkip); } if ($key == 'hostgroups') { $value = $this->checkTpl($value, 'hostgroups_tploptions', 'tbl_hosttemplate', $intDataId, $intSkip); } if ($key == 'contacts') { $value = $this->checkTpl($value, 'contacts_tploptions', 'tbl_hosttemplate', $intDataId, $intSkip); } if ($key == 'contact_groups') { $value = $this->checkTpl($value, 'contact_groups_tploptions', 'tbl_hosttemplate', $intDataId, $intSkip); } if ($key == 'use') { $value = $this->checkTpl($value, 'use_template_tploptions', 'tbl_hosttemplate', $intDataId, $intSkip); } } if ($strTableName == 'tbl_servicetemplate') { if ($key == 'template_name') { $key = 'name'; } if ($key == 'use_template') { $key = 'use'; } if ($this->intNagVersion < 2) { if ($key == 'check_interval') { $key = 'normal_check_interval'; } if ($key == 'retry_interval') { $key = 'retry_check_interval'; } } $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'; if (\in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'host_name') { $value = $this->checkTpl($value, 'host_name_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip); } if ($key == 'hostgroup_name') { $value = $this->checkTpl( $value, 'hostgroup_name_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip ); } if ($key == 'parents') { $value = $this->checkTpl($value, 'parents_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip); } if ($key == 'servicegroups') { $value = $this->checkTpl( $value, 'servicegroups_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip ); } if ($key == 'contacts') { $value = $this->checkTpl($value, 'contacts_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip); } if ($key == 'contact_groups') { $value = $this->checkTpl( $value, 'contact_groups_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip ); } if ($key == 'use') { $value = $this->checkTpl( $value, 'use_template_tploptions', 'tbl_servicetemplate', $intDataId, $intSkip ); } } if ($strTableName == 'tbl_contact') { if ($key == 'use_template') { $key = 'use'; } $strVIValues = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,'; $strVIValues .= 'retain_status_information,retain_nonstatus_information'; if (\in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'contactgroups') { $value = $this->checkTpl($value, 'contactgroups_tploptions', 'tbl_contact', $intDataId, $intSkip); } if ($key == 'host_notification_commands') { $value = $this->checkTpl( $value, 'host_notification_commands_tploptions', 'tbl_contact', $intDataId, $intSkip ); } if ($key == 'service_notification_commands') { $value = $this->checkTpl( $value, 'service_notification_commands_tploptions', 'tbl_contact', $intDataId, $intSkip ); } if ($key == 'use') { $value = $this->checkTpl($value, 'use_template_tploptions', 'tbl_contact', $intDataId, $intSkip); } } if ($strTableName == 'tbl_contacttemplate') { if ($key == 'template_name') { $key = 'name'; } if ($key == 'use_template') { $key = 'use'; } $strVIValues = 'host_notifications_enabled,service_notifications_enabled,can_submit_commands,'; $strVIValues .= 'retain_status_information,retain_nonstatus_information'; if (in_array($key, explode(',', $strVIValues), true)) { if ($value == -1) { $value = 'null'; } if ($value == 3) { $value = 'null'; } } if ($key == 'contactgroups') { $value = $this->checkTpl( $value, 'contactgroups_tploptions', 'tbl_contacttemplate', $intDataId, $intSkip ); } if ($key == 'host_notification_commands') { $value = $this->checkTpl( $value, 'host_notification_commands_tploptions', 'tbl_contacttemplate', $intDataId, $intSkip ); } if ($key == 'service_notification_commands') { $value = $this->checkTpl( $value, 'service_notification_commands_tploptions', 'tbl_contacttemplate', $intDataId, $intSkip ); } if ($key == 'use') { $value = $this->checkTpl( $value, 'use_template_tploptions', 'tbl_contacttemplate', $intDataId, $intSkip ); } } if ((($strTableName == 'tbl_hosttemplate') || ($strTableName == 'tbl_servicetemplate') || ($strTableName == 'tbl_contacttemplate')) && $key == 'register') { $value = '0'; } if ($strTableName == 'tbl_timeperiod' && $key == 'use_template') { $key = 'use'; } } /** * Open configuration file * @param string $strFile File name * @param int $intConfigID Configuration ID * @param int $intType Type ID * @param resource|bool $resConfigFile Temporary or configuration file ressource (by reference) * @param string $strConfigFile Configuration file name (by reference) * @return int 0 = successful / 1 = error */ private function getConfigFile($strFile, $intConfigID, $intType, &$resConfigFile, &$strConfigFile) { // Variable definitions $strBaseDir = ''; $intMethod = 1; $intReturn = 0; // Get config data if ($intType == 1) { $this->getConfigData($intConfigID, 'hostconfig', $strBaseDir); $strType = 'host'; } elseif ($intType == 2) { $this->getConfigData($intConfigID, 'serviceconfig', $strBaseDir); $strType = 'service'; } else { $this->getConfigData($intConfigID, 'basedir', $strBaseDir); $strType = 'basic'; } $this->getConfigData($intConfigID, 'method', $intMethod); // Backup config file $this->moveFile($strType, $strFile, $intConfigID); // Variable definition $strConfigFile = $strBaseDir. '/' .$strFile; // Local file system if ($intMethod == 1) { // Save configuration file if (is_writable($strConfigFile) || (!file_exists($strConfigFile) && is_writable($strBaseDir))) { $resConfigFile = fopen($strConfigFile, 'wb'); chmod($strConfigFile, 0644); } else { $this->myDataClass->writeLog(translate('Configuration write failed:'). ' ' .$strFile); $this->processClassMessage(translate('Cannot open/overwrite the configuration file (check the ' .'permissions)!'). '::', $this->strErrorMessage); $intReturn = 1; } } elseif ($intMethod == 2) { // Remote file (FTP) // Check connection if (empty($this->resConnectId) || !\is_resource($this->resConnectId) || ($this->resConnectType != 'FTP')) { $intReturn = $this->getFTPConnection($intConfigID); } if ($intReturn == 0) { // Open the config file if (isset($this->arrSettings['path']) && isset($this->arrSettings['path']['tempdir'])) { $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql'); } else { $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql'); } $resConfigFile = fopen($strConfigFile, 'wb'); } } elseif ($intMethod == 3) { // Remote file (SFTP) // Check connection if (empty($this->resConnectId) || !\is_resource($this->resConnectId) || ($this->resConnectType != 'SSH')) { $intReturn = $this->getSSHConnection($intConfigID); } if ($intReturn == 0) { if (isset($this->arrSettings['path']) && isset($this->arrSettings['path']['tempdir'])) { $strConfigFile = tempnam($this->arrSettings['path']['tempdir'], 'nagiosql'); } else { $strConfigFile = tempnam(sys_get_temp_dir(), 'nagiosql'); } $resConfigFile = fopen($strConfigFile, 'wb'); } } return $intReturn; } /** * Write configuration file * @param string $strData Data string * @param string $strFile File name * @param int $intType Type ID * @param int $intConfigID Configuration target ID * @param resource $resConfigFile Temporary or configuration file ressource * @param string $strConfigFile Configuration file name * @return int 0 = successful / 1 = error */ private function writeConfigFile($strData, $strFile, $intType, $intConfigID, $resConfigFile, $strConfigFile) { // Variable definitions $intReturn = 0; // Get config data if ($intType == 1) { $this->getConfigData($intConfigID, 'hostconfig', $strBaseDir); } elseif ($intType == 2) { $this->getConfigData($intConfigID, 'serviceconfig', $strBaseDir); } else { $this->getConfigData($intConfigID, 'basedir', $strBaseDir); } $this->getConfigData($intConfigID, 'method', $intMethod); $strData = str_replace("\r\n", "\n", $strData); fwrite($resConfigFile, $strData); // Local filesystem if ($intMethod == 1) { fclose($resConfigFile); } elseif ($intMethod == 2) { // FTP access // SSH Possible if (!\function_exists('ftp_put')) { $this->processClassMessage(translate('FTP module not loaded!'). '::', $this->strErrorMessage); $intReturn = 1; } else { $intErrorReporting = error_reporting(); error_reporting(0); if (!ftp_put($this->resConnectId, $strBaseDir . '/' . $strFile, $strConfigFile, FTP_ASCII)) { $arrError = error_get_last(); error_reporting($intErrorReporting); $this->processClassMessage(translate('Cannot open/overwrite the configuration file (FTP connection ' .'failed)!') . '::', $this->strErrorMessage); if ($arrError['message'] != '') { $this->processClassMessage($arrError['message'] . '::', $this->strErrorMessage); } $intReturn = 1; } error_reporting($intErrorReporting); ftp_close($this->resConnectId); fclose($resConfigFile); } } elseif ($intMethod == 3) { // SSH access // SSH Possible if (!\function_exists('ssh2_scp_send')) { $this->processClassMessage(translate('SSH module not loaded!'). '::', $this->strErrorMessage); $intReturn = 1; } else { $intErrorReporting = error_reporting(); error_reporting(0); if (!ssh2_scp_send($this->resConnectId, $strConfigFile, $strBaseDir . '/' . $strFile, 0644)) { $arrError = error_get_last(); error_reporting($intErrorReporting); $this->processClassMessage(translate('Cannot open/overwrite the configuration file (remote SFTP)!'). '::', $this->strErrorMessage); if ($arrError['message'] != '') { $this->processClassMessage($arrError['message'] . '::', $this->strErrorMessage); } $this->resConnectId = null; $intReturn = 1; } error_reporting($intErrorReporting); fclose($resConfigFile); unlink($strConfigFile); $this->resConnectId = null; } } if ($intReturn == 0) { $this->myDataClass->writeLog(translate('Configuration successfully written:') . ' ' . $strFile); $this->processClassMessage(translate('Configuration file successfully written!'). '::', $this->strInfoMessage); } return $intReturn; } /** * Process special settings based on template option * @param string $strValue Original data value * @param string $strKeyField Template option field name * @param string $strTable Table name * @param int $intId Dataset ID * @param int $intSkip Skip value (by reference) * @return string Manipulated data value */ public function checkTpl($strValue, $strKeyField, $strTable, $intId, &$intSkip) { if ($this->intNagVersion < 3) { return $strValue; } $strSQL = 'SELECT `' .$strKeyField. '` FROM `' .$strTable."` WHERE `id` = $intId"; $intValue = $this->myDBClass->getFieldData($strSQL); if ($intValue == 0) { return('+' .$strValue); } if ($intValue == 1) { $intSkip = 0; return 'null'; } return $strValue; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @param string $strDomainWhere1 SQL WHERE add-in * @return int 0 = use data / 1 = skip data */ private function processRelation1($arrData, &$strDataValue, $elem, $strDomainWhere1) { // Define variables $arrDataRel = array(); $intDataCountRel = 0; $intReturn = 0; // Get relation data $strSQLRel = 'SELECT `' . $elem['tableName1'] . '`.`' . $elem['target1'] . '`, `' . $elem['linkTable'] . '`.`exclude` FROM `' . $elem['linkTable'] . '` LEFT JOIN `' . $elem['tableName1'] . '` ON `' . $elem['linkTable'] . '`.`idSlave` = `' . $elem['tableName1'] . '`.`id`' . 'WHERE `idMaster`=' . $arrData['id'] . " AND `active`='1' AND $strDomainWhere1" . 'ORDER BY `' . $elem['tableName1'] . '`.`' . $elem['target1'] . '`'; $booReturn = $this->myDBClass->hasDataArray($strSQLRel, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data if ($strDataValue == 2) { $strDataValue = '*,'; } else { $strDataValue = ''; } foreach ($arrDataRel as $data) { if ($data['exclude'] == 0) { $strDataValue .= $data[$elem['target1']] . ','; } elseif ($this->intNagVersion >= 3) { $strDataValue .= '!' . $data[$elem['target1']] . ','; } } $strDataValue = substr($strDataValue, 0, -1); if ($strDataValue == '') { $intReturn = 1; } } else { if ($strDataValue == 2) { $strDataValue = '*'; } else { $intReturn = 1; } } return $intReturn; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @param string $strDomainWhere1 SQL WHERE add-in * @return int 0 = use data / 1 = skip data */ private function processRelation2($arrData, &$strDataValue, $elem, $strDomainWhere1) { // Define variables $arrDataRel = array(); $arrField = array(); $intDataCountRel = 0; $intReturn = 0; $strCommand = ''; // Get relation data if (($elem['tableName1'] == 'tbl_command') && (substr_count($arrData[$elem['fieldName']], '!') != 0)) { $arrField = explode('!', $arrData[$elem['fieldName']]); $strCommand = strstr($arrData[$elem['fieldName']], '!'); $strSQLRel = 'SELECT `' . $elem['target1'] . '` FROM `' . $elem['tableName1'] . '`' . 'WHERE `id`=' . $arrField[0] . " AND `active`='1' AND $strDomainWhere1"; } else { $strSQLRel = 'SELECT `' . $elem['target1'] . '` FROM `' . $elem['tableName1'] . '`' . 'WHERE `id`=' . $arrData[$elem['fieldName']] . " AND `active`='1' AND $strDomainWhere1"; } $booReturn = $this->myDBClass->hasDataArray($strSQLRel, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data if (($elem['tableName1'] == 'tbl_command') && (substr_count($strDataValue, '!') != 0)) { $strDataValue = $arrDataRel[0][$elem['target1']] . $strCommand; } else { $strDataValue = $arrDataRel[0][$elem['target1']]; } } else { if (($elem['tableName1'] == 'tbl_command') && (substr_count($strDataValue, '!') != 0) && ($arrField[0] == -1)) { $strDataValue = 'null'; } else { $intReturn = 1; } } return $intReturn; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @param string $strDomainWhere1 SQL WHERE add-in * @return int 0 = use data / 1 = skip data */ private function processRelation3($arrData, &$strDataValue, $elem, $strDomainWhere1) { // Define variables $arrDataRel = array(); $intDataCountRel = 0; $intReturn = 0; // Get relation data $strSQLRel = 'SELECT * FROM `' .$elem['linkTable']. '` WHERE `idMaster`=' .$arrData['id']. ' ORDER BY idSort'; $booReturn = $this->myDBClass->hasDataArray($strSQLRel, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data $strDataValue = ''; foreach ($arrDataRel as $data) { if ($data['idTable'] == 1) { $strSQLName = 'SELECT `' .$elem['target1']. '` FROM `' .$elem['tableName1']. '`' . "WHERE `active`='1' AND $strDomainWhere1 AND `id`=".$data['idSlave']; } else { $strSQLName = 'SELECT `' .$elem['target2']. '` FROM `' .$elem['tableName2']. '`' . "WHERE `active`='1' AND $strDomainWhere1 AND `id`=".$data['idSlave']; } $strDataValue .= $this->myDBClass->getFieldData($strSQLName) . ','; } $strDataValue = substr($strDataValue, 0, -1); } else { $intReturn = 1; } return $intReturn; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @param string $strDomainWhere1 SQL WHERE add-in * @return int 0 = use data / 1 = skip data */ private function processRelation4($arrData, &$strDataValue, $elem, $strDomainWhere1) { // Define variables $arrDataRel = array(); $intDataCountRel = 0; $intReturn = 0; // Get relation data $strSQLRel = 'SELECT `' .$elem['linkTable']. '`.`strSlave`, `' .$elem['linkTable']. '`.`exclude` ' . 'FROM `' .$elem['linkTable']. '` ' . 'LEFT JOIN `tbl_service` ON `' .$elem['linkTable']. '`.`idSlave`=`tbl_service`.`id` ' . 'WHERE `' .$elem['linkTable']. '`.`idMaster`=' .$arrData['id']." AND `active`='1' AND ". $strDomainWhere1. ' ' . 'ORDER BY `' .$elem['linkTable']. '`.`strSlave`'; $booReturn = $this->myDBClass->hasDataArray($strSQLRel, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data if ($strDataValue == 2) { $strDataValue = '*,'; } else { $strDataValue = ''; } foreach ($arrDataRel as $data) { if ($data['exclude'] == 0) { $strDataValue .= $data['strSlave'] . ','; } elseif ($this->intNagVersion >= 3) { $strDataValue .= '!' . $data['strSlave'] . ','; } } $strDataValue = substr($strDataValue, 0, -1); if ($strDataValue == '') { $intReturn = 1; } } else { if ($strDataValue == 2) { $strDataValue = '*'; } else { $intReturn = 1; } } return $intReturn; } /** * @param \HTML_Template_IT $resTemplate Template object * @param array $arrData Dataset array * @param array $elem Relation data array * @return int 0 = use data / 1 = skip data */ private function processRelation5($resTemplate, $arrData, $elem) { // Define variables $arrDataRel = array(); $intDataCountRel = 0; $strSQLRel = 'SELECT * FROM `tbl_variabledefinition` LEFT JOIN `' .$elem['linkTable']. '` ' . 'ON `id`=`idSlave` WHERE `idMaster`=' .$arrData['id']. ' ORDER BY `name`'; $booReturn = $this->myDBClass->hasDataArray($strSQLRel, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { foreach ($arrDataRel as $vardata) { // Insert fill spaces $strFillLen = (30 - \strlen($vardata['name'])); $strSpace = ' '; for ($f = 0; $f < $strFillLen; $f++) { $strSpace .= ' '; } $resTemplate->setVariable('ITEM_TITLE', $vardata['name'] . $strSpace); $resTemplate->setVariable('ITEM_VALUE', $vardata['value']); $resTemplate->parse('configline'); } } return 1; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @param string $strDomainWhere1 SQL WHERE add-in * @return int 0 = use data / 1 = skip data */ private function processRelation6($arrData, &$strDataValue, $elem, $strDomainWhere1) { // Define variables $arrDataRel = array(); $arrHG1 = array(); $arrHG2 = array(); $intDataCountRel = 0; $intHG1 = 0; $intHG2 = 0; $intReturn = 0; // Get relation data $strSQLMaster = 'SELECT * FROM `' . $elem['linkTable'] . '` WHERE `idMaster`=' . $arrData['id']; $booReturn = $this->myDBClass->hasDataArray($strSQLMaster, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data $strDataValue = ''; foreach ($arrDataRel as $data) { if ($data['idSlaveHG'] != 0) { $strSQLSrv = 'SELECT `' . $elem['target2'] . '` FROM `' . $elem['tableName2'] . '` WHERE `id`=' . $data['idSlaveS']; $strService = $this->myDBClass->getFieldData($strSQLSrv); $strSQLHG1 = 'SELECT `host_name` FROM `tbl_host` ' . 'LEFT JOIN `tbl_lnkHostgroupToHost` ON `id`=`idSlave` ' . 'WHERE `idMaster`=' . $data['idSlaveHG'] . " AND `active`='1' AND $strDomainWhere1"; $booReturn = $this->myDBClass->hasDataArray($strSQLHG1, $arrHG1, $intHG1); if ($booReturn && ($intHG1 != 0)) { foreach ($arrHG1 as $elemHG1) { if (substr_count($strDataValue, $elemHG1['host_name'] . ',' . $strService) == 0) { $strDataValue .= $elemHG1['host_name'] . ',' . $strService . ','; } } } $strSQLHG2 = 'SELECT `host_name` FROM `tbl_host` ' . 'LEFT JOIN `tbl_lnkHostToHostgroup` ON `id`=`idMaster` ' . 'WHERE `idSlave`=' . $data['idSlaveHG'] . " AND `active`='1' AND $strDomainWhere1"; $booReturn = $this->myDBClass->hasDataArray($strSQLHG2, $arrHG2, $intHG2); if ($booReturn && ($intHG2 != 0)) { foreach ($arrHG2 as $elemHG2) { if (substr_count($strDataValue, $elemHG2['host_name'] . ',' . $strService) == 0) { $strDataValue .= $elemHG2['host_name'] . ',' . $strService . ','; } } } } else { $strSQLHost = 'SELECT `' . $elem['target1'] . '` FROM `' . $elem['tableName1'] . '` ' . 'WHERE `id`=' . $data['idSlaveH'] . " AND `active`='1' AND $strDomainWhere1"; $strHost = $this->myDBClass->getFieldData($strSQLHost); $strSQLSrv = 'SELECT `' . $elem['target2'] . '` FROM `' . $elem['tableName2'] . '` ' . 'WHERE `id`=' . $data['idSlaveS'] . " AND `active`='1' AND $strDomainWhere1"; $strService = $this->myDBClass->getFieldData($strSQLSrv); if (($strHost != '') && ($strService != '') && substr_count($strDataValue, $strHost . ',' . $strService) == 0) { $strDataValue .= $strHost . ',' . $strService . ','; } } } $strDataValue = substr($strDataValue, 0, -1); if ($strDataValue == '') { $intReturn = 1; } } else { $intReturn = 1; } return $intReturn; } /** * @param array $arrData Dataset array * @param string $strDataValue Data value * @param array $elem Relation data array * @return int 0 = use data / 1 = skip data */ private function processRelation7($arrData, &$strDataValue, $elem) { $intReturn = 1; // Get relation data $strSQLMaster = 'SELECT * FROM `' . $elem['linkTable'] . '` WHERE `idMaster`=' . $arrData['id']; $booReturn = $this->myDBClass->hasDataArray($strSQLMaster, $arrDataRel, $intDataCountRel); if ($booReturn && ($intDataCountRel != 0)) { // Rewrite $strDataValue with returned relation data $strDataValue = ''; /** @var array $arrDataRel */ foreach ($arrDataRel as $data) { $strSQL = 'SELECT host_name FROM tbl_host WHERE id=' .$data['idHost']; $strHost = $this->myDBClass->getFieldData($strSQL); $strSQL = 'SELECT service_description FROM tbl_service WHERE id=' .$data['idSlave']; $strService = $this->myDBClass->getFieldData($strSQL); $strDataValue .= $strHost . ',' . $strService . ','; $intReturn = 0; } $strDataValue = substr($strDataValue, 0, -1); } return $intReturn; } }