You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							355 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							355 lines
						
					
					
						
							10 KiB
						
					
					
				<?php
 | 
						|
/*
 | 
						|
** Zabbix
 | 
						|
** Copyright (C) 2001-2023 Zabbix SIA
 | 
						|
**
 | 
						|
** This program is free software; you can redistribute it and/or modify
 | 
						|
** it under the terms of the GNU General Public License as published by
 | 
						|
** the Free Software Foundation; either version 2 of the License, or
 | 
						|
** (at your option) any later version.
 | 
						|
**
 | 
						|
** This program is distributed in the hope that it will be useful,
 | 
						|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | 
						|
** GNU General Public License for more details.
 | 
						|
**
 | 
						|
** You should have received a copy of the GNU General Public License
 | 
						|
** along with this program; if not, write to the Free Software
 | 
						|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
						|
**/
 | 
						|
 | 
						|
 | 
						|
class CConfigFile {
 | 
						|
 | 
						|
	const CONFIG_NOT_FOUND = 1;
 | 
						|
	const CONFIG_ERROR = 2;
 | 
						|
	const CONFIG_VAULT_ERROR = 3;
 | 
						|
 | 
						|
	const CONFIG_FILE_PATH = '/conf/zabbix.conf.php';
 | 
						|
 | 
						|
	private static $supported_db_types = [
 | 
						|
		ZBX_DB_MYSQL => true,
 | 
						|
		ZBX_DB_ORACLE => true,
 | 
						|
		ZBX_DB_POSTGRESQL => true
 | 
						|
	];
 | 
						|
 | 
						|
	public $configFile = null;
 | 
						|
	public $config = [];
 | 
						|
	public $error = '';
 | 
						|
 | 
						|
	private static function exception($error, $code = self::CONFIG_ERROR) {
 | 
						|
		throw new ConfigFileException($error, $code);
 | 
						|
	}
 | 
						|
 | 
						|
	public function __construct($file = null) {
 | 
						|
		$this->setDefaults();
 | 
						|
 | 
						|
		if (!is_null($file)) {
 | 
						|
			$this->setFile($file);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function setFile($file) {
 | 
						|
		$this->configFile = $file;
 | 
						|
	}
 | 
						|
 | 
						|
	public function load() {
 | 
						|
		if (!file_exists($this->configFile)) {
 | 
						|
			self::exception('Config file does not exist.', self::CONFIG_NOT_FOUND);
 | 
						|
		}
 | 
						|
 | 
						|
		if (!is_readable($this->configFile)) {
 | 
						|
			self::exception('Permission denied.');
 | 
						|
		}
 | 
						|
 | 
						|
		ob_start();
 | 
						|
		include($this->configFile);
 | 
						|
		ob_end_clean();
 | 
						|
 | 
						|
		if (!isset($DB['TYPE'])) {
 | 
						|
			self::exception('DB type is not set.');
 | 
						|
		}
 | 
						|
 | 
						|
		if (!array_key_exists($DB['TYPE'], self::$supported_db_types)) {
 | 
						|
			self::exception(
 | 
						|
				'Incorrect value "'.$DB['TYPE'].'" for DB type. Possible values '.
 | 
						|
				implode(', ', array_keys(self::$supported_db_types)).'.'
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		$php_supported_db = array_keys(CFrontendSetup::getSupportedDatabases());
 | 
						|
 | 
						|
		if (!in_array($DB['TYPE'], $php_supported_db)) {
 | 
						|
			self::exception('DB type "'.$DB['TYPE'].'" is not supported by current setup.'.
 | 
						|
				($php_supported_db ? ' Possible values '.implode(', ', $php_supported_db).'.' : '')
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		if (!isset($DB['DATABASE'])) {
 | 
						|
			self::exception('DB database is not set.');
 | 
						|
		}
 | 
						|
 | 
						|
		$this->setDefaults();
 | 
						|
 | 
						|
		$this->config['DB']['TYPE'] = $DB['TYPE'];
 | 
						|
		$this->config['DB']['DATABASE'] = $DB['DATABASE'];
 | 
						|
 | 
						|
		if (isset($DB['SERVER'])) {
 | 
						|
			$this->config['DB']['SERVER'] = $DB['SERVER'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['PORT'])) {
 | 
						|
			$this->config['DB']['PORT'] = $DB['PORT'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['USER'])) {
 | 
						|
			$this->config['DB']['USER'] = $DB['USER'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['PASSWORD'])) {
 | 
						|
			$this->config['DB']['PASSWORD'] = $DB['PASSWORD'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['SCHEMA'])) {
 | 
						|
			$this->config['DB']['SCHEMA'] = $DB['SCHEMA'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['ENCRYPTION'])) {
 | 
						|
			$this->config['DB']['ENCRYPTION'] = $DB['ENCRYPTION'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VERIFY_HOST'])) {
 | 
						|
			$this->config['DB']['VERIFY_HOST'] = $DB['VERIFY_HOST'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['KEY_FILE'])) {
 | 
						|
			$this->config['DB']['KEY_FILE'] = $DB['KEY_FILE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['CERT_FILE'])) {
 | 
						|
			$this->config['DB']['CERT_FILE'] = $DB['CERT_FILE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['CA_FILE'])) {
 | 
						|
			$this->config['DB']['CA_FILE'] = $DB['CA_FILE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['CIPHER_LIST'])) {
 | 
						|
			$this->config['DB']['CIPHER_LIST'] = $DB['CIPHER_LIST'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT'])) {
 | 
						|
			$this->config['DB']['VAULT'] = $DB['VAULT'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_URL'])) {
 | 
						|
			$this->config['DB']['VAULT_URL'] = $DB['VAULT_URL'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_DB_PATH'])) {
 | 
						|
			$this->config['DB']['VAULT_DB_PATH'] = $DB['VAULT_DB_PATH'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_TOKEN'])) {
 | 
						|
			$this->config['DB']['VAULT_TOKEN'] = $DB['VAULT_TOKEN'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_CACHE'])) {
 | 
						|
			$this->config['DB']['VAULT_CACHE'] = $DB['VAULT_CACHE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_KEY_FILE'])) {
 | 
						|
			$this->config['DB']['VAULT_KEY_FILE'] = $DB['VAULT_KEY_FILE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($DB['VAULT_CERT_FILE'])) {
 | 
						|
			$this->config['DB']['VAULT_CERT_FILE'] = $DB['VAULT_CERT_FILE'];
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($ZBX_SERVER) && $ZBX_SERVER !== '') {
 | 
						|
			$this->config['ZBX_SERVER'] = $ZBX_SERVER;
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($ZBX_SERVER_PORT) && $ZBX_SERVER_PORT !== '') {
 | 
						|
			$this->config['ZBX_SERVER_PORT'] = $ZBX_SERVER_PORT;
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($ZBX_SERVER_NAME)) {
 | 
						|
			$this->config['ZBX_SERVER_NAME'] = $ZBX_SERVER_NAME;
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($IMAGE_FORMAT_DEFAULT)) {
 | 
						|
			$this->config['IMAGE_FORMAT_DEFAULT'] = $IMAGE_FORMAT_DEFAULT;
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($HISTORY)) {
 | 
						|
			$this->config['HISTORY'] = $HISTORY;
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($SSO)) {
 | 
						|
			$this->config['SSO'] = $SSO;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->makeGlobal();
 | 
						|
 | 
						|
		return $this->config;
 | 
						|
	}
 | 
						|
 | 
						|
	public function makeGlobal() {
 | 
						|
		global $DB, $ZBX_SERVER, $ZBX_SERVER_PORT, $ZBX_SERVER_NAME, $IMAGE_FORMAT_DEFAULT, $HISTORY, $SSO;
 | 
						|
 | 
						|
		$DB = $this->config['DB'];
 | 
						|
		$ZBX_SERVER = $this->config['ZBX_SERVER'];
 | 
						|
		$ZBX_SERVER_PORT = $this->config['ZBX_SERVER_PORT'];
 | 
						|
		$ZBX_SERVER_NAME = $this->config['ZBX_SERVER_NAME'];
 | 
						|
		$IMAGE_FORMAT_DEFAULT = $this->config['IMAGE_FORMAT_DEFAULT'];
 | 
						|
		$HISTORY = $this->config['HISTORY'];
 | 
						|
		$SSO = $this->config['SSO'];
 | 
						|
	}
 | 
						|
 | 
						|
	public function save() {
 | 
						|
		try {
 | 
						|
			$file = $this->configFile;
 | 
						|
 | 
						|
			if (is_null($file)) {
 | 
						|
				self::exception('Cannot save, config file is not set.');
 | 
						|
			}
 | 
						|
 | 
						|
			$this->check();
 | 
						|
 | 
						|
			if (is_link($file)) {
 | 
						|
				$file = readlink($file);
 | 
						|
			}
 | 
						|
 | 
						|
			$file_is_writable = ((!file_exists($file) && is_writable(dirname($file))) || is_writable($file));
 | 
						|
 | 
						|
			if ($file_is_writable && file_put_contents($file, $this->getString())) {
 | 
						|
				if (!chmod($file, 0600)) {
 | 
						|
					self::exception(_('Unable to change configuration file permissions to 0600.'));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			elseif (is_readable($file)) {
 | 
						|
				if (file_get_contents($file) !== $this->getString()) {
 | 
						|
					self::exception(_('Unable to overwrite the existing configuration file.'));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				self::exception(_('Unable to create the configuration file.'));
 | 
						|
			}
 | 
						|
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		catch (Exception $e) {
 | 
						|
			$this->error = $e->getMessage();
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function getString() {
 | 
						|
		return
 | 
						|
'<?php
 | 
						|
// Zabbix GUI configuration file.
 | 
						|
 | 
						|
$DB[\'TYPE\']			= \''.addcslashes($this->config['DB']['TYPE'], "'\\").'\';
 | 
						|
$DB[\'SERVER\']			= \''.addcslashes($this->config['DB']['SERVER'], "'\\").'\';
 | 
						|
$DB[\'PORT\']			= \''.addcslashes($this->config['DB']['PORT'], "'\\").'\';
 | 
						|
$DB[\'DATABASE\']			= \''.addcslashes($this->config['DB']['DATABASE'], "'\\").'\';
 | 
						|
$DB[\'USER\']			= \''.addcslashes($this->config['DB']['USER'], "'\\").'\';
 | 
						|
$DB[\'PASSWORD\']			= \''.addcslashes($this->config['DB']['PASSWORD'], "'\\").'\';
 | 
						|
 | 
						|
// Schema name. Used for PostgreSQL.
 | 
						|
$DB[\'SCHEMA\']			= \''.addcslashes($this->config['DB']['SCHEMA'], "'\\").'\';
 | 
						|
 | 
						|
// Used for TLS connection.
 | 
						|
$DB[\'ENCRYPTION\']		= '.($this->config['DB']['ENCRYPTION'] ? 'true' : 'false').';
 | 
						|
$DB[\'KEY_FILE\']			= \''.addcslashes($this->config['DB']['KEY_FILE'], "'\\").'\';
 | 
						|
$DB[\'CERT_FILE\']		= \''.addcslashes($this->config['DB']['CERT_FILE'], "'\\").'\';
 | 
						|
$DB[\'CA_FILE\']			= \''.addcslashes($this->config['DB']['CA_FILE'], "'\\").'\';
 | 
						|
$DB[\'VERIFY_HOST\']		= '.($this->config['DB']['VERIFY_HOST'] ? 'true' : 'false').';
 | 
						|
$DB[\'CIPHER_LIST\']		= \''.addcslashes($this->config['DB']['CIPHER_LIST'], "'\\").'\';
 | 
						|
 | 
						|
// Vault configuration. Used if database credentials are stored in Vault secrets manager.
 | 
						|
$DB[\'VAULT\']			= \''.addcslashes($this->config['DB']['VAULT'], "'\\").'\';
 | 
						|
$DB[\'VAULT_URL\']		= \''.addcslashes($this->config['DB']['VAULT_URL'], "'\\").'\';
 | 
						|
$DB[\'VAULT_DB_PATH\']		= \''.addcslashes($this->config['DB']['VAULT_DB_PATH'], "'\\").'\';
 | 
						|
$DB[\'VAULT_TOKEN\']		= \''.addcslashes($this->config['DB']['VAULT_TOKEN'], "'\\").'\';
 | 
						|
$DB[\'VAULT_CERT_FILE\']		= \''.addcslashes($this->config['DB']['VAULT_CERT_FILE'], "'\\").'\';
 | 
						|
$DB[\'VAULT_KEY_FILE\']		= \''.addcslashes($this->config['DB']['VAULT_KEY_FILE'], "'\\").'\';
 | 
						|
// Uncomment to bypass local caching of credentials.
 | 
						|
// $DB[\'VAULT_CACHE\']		= true;
 | 
						|
 | 
						|
// Uncomment and set to desired values to override Zabbix hostname/IP and port.
 | 
						|
// $ZBX_SERVER			= \'\';
 | 
						|
// $ZBX_SERVER_PORT		= \'\';
 | 
						|
 | 
						|
$ZBX_SERVER_NAME		= \''.addcslashes($this->config['ZBX_SERVER_NAME'], "'\\").'\';
 | 
						|
 | 
						|
$IMAGE_FORMAT_DEFAULT	= IMAGE_FORMAT_PNG;
 | 
						|
 | 
						|
// Uncomment this block only if you are using Elasticsearch.
 | 
						|
// Elasticsearch url (can be string if same url is used for all types).
 | 
						|
//$HISTORY[\'url\'] = [
 | 
						|
//	\'uint\' => \'http://localhost:9200\',
 | 
						|
//	\'text\' => \'http://localhost:9200\'
 | 
						|
//];
 | 
						|
// Value types stored in Elasticsearch.
 | 
						|
//$HISTORY[\'types\'] = [\'uint\', \'text\'];
 | 
						|
 | 
						|
// Used for SAML authentication.
 | 
						|
// Uncomment to override the default paths to SP private key, SP and IdP X.509 certificates, and to set extra settings.
 | 
						|
//$SSO[\'SP_KEY\']			= \'conf/certs/sp.key\';
 | 
						|
//$SSO[\'SP_CERT\']			= \'conf/certs/sp.crt\';
 | 
						|
//$SSO[\'IDP_CERT\']		= \'conf/certs/idp.crt\';
 | 
						|
//$SSO[\'SETTINGS\']		= [];
 | 
						|
';
 | 
						|
	}
 | 
						|
 | 
						|
	protected function setDefaults() {
 | 
						|
		$this->config['DB'] = [
 | 
						|
			'TYPE' => null,
 | 
						|
			'SERVER' => 'localhost',
 | 
						|
			'PORT' => '0',
 | 
						|
			'DATABASE' => null,
 | 
						|
			'USER' => '',
 | 
						|
			'PASSWORD' => '',
 | 
						|
			'SCHEMA' => '',
 | 
						|
			'ENCRYPTION' => false,
 | 
						|
			'KEY_FILE' => '',
 | 
						|
			'CERT_FILE' => '',
 | 
						|
			'CA_FILE' => '',
 | 
						|
			'VERIFY_HOST' => true,
 | 
						|
			'CIPHER_LIST' => '',
 | 
						|
			'VAULT' => '',
 | 
						|
			'VAULT_URL' => '',
 | 
						|
			'VAULT_DB_PATH' => '',
 | 
						|
			'VAULT_TOKEN' => '',
 | 
						|
			'VAULT_CERT_FILE' => '',
 | 
						|
			'VAULT_KEY_FILE' => '',
 | 
						|
			'VAULT_CACHE' => false
 | 
						|
		];
 | 
						|
		$this->config['ZBX_SERVER'] = null;
 | 
						|
		$this->config['ZBX_SERVER_PORT'] = null;
 | 
						|
		$this->config['ZBX_SERVER_NAME'] = '';
 | 
						|
		$this->config['IMAGE_FORMAT_DEFAULT'] = IMAGE_FORMAT_PNG;
 | 
						|
		$this->config['HISTORY'] = null;
 | 
						|
		$this->config['SSO'] = null;
 | 
						|
	}
 | 
						|
 | 
						|
	protected function check() {
 | 
						|
		if (!isset($this->config['DB']['TYPE'])) {
 | 
						|
			self::exception('DB type is not set.');
 | 
						|
		}
 | 
						|
 | 
						|
		if (!array_key_exists($this->config['DB']['TYPE'], self::$supported_db_types)) {
 | 
						|
			self::exception(
 | 
						|
				'Incorrect value "'.$this->config['DB']['TYPE'].'" for DB type. Possible values '.
 | 
						|
				implode(', ', array_keys(self::$supported_db_types)).'.'
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		if (!isset($this->config['DB']['DATABASE'])) {
 | 
						|
			self::exception('DB database is not set.');
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |