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.');
|
|
}
|
|
}
|
|
}
|