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.

158 lines
5.8 KiB

1 year ago
/*
** 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.
**/
const ZBX_STYLE_DISPLAY_NONE = 'display-none';
const ZBX_DB_MYSQL = 'MYSQL';
const ZBX_DB_POSTGRESQL = 'POSTGRESQL';
const ZBX_DB_ORACLE = 'ORACLE';
const DB_STORE_CREDS_VAULT_HASHICORP = 1;
const DB_STORE_CREDS_VAULT_CYBERARK = 2;
const STEP_WELCOME = 1;
const STEP_DB_CONNECTION = 3;
const STEP_SETTINGS = 4;
const view = new class {
constructor() {
this._is_endpoint_default = true;
}
init({step, hashicorp_endpoint_default, cyberark_endpoint_default}) {
this._hashicorp_endpoint_default = hashicorp_endpoint_default;
this._cyberark_endpoint_default = cyberark_endpoint_default;
const form = document.getElementById('setup-form');
switch (step) {
case STEP_WELCOME:
document.getElementById('default-lang').addEventListener('change', () => form.submit());
break;
case STEP_DB_CONNECTION:
for (const id of ['type', 'server', 'tls_encryption', 'verify_certificate', 'creds_storage',
'vault_certificates_toggle', 'vault_url']) {
document.getElementById(id).addEventListener('change', () => this._update());
}
this._update();
break;
case STEP_SETTINGS:
document.getElementById('default-theme').addEventListener('change', () => form.submit())
break;
}
}
_update() {
const verify_host = document.getElementById('verify_host');
const tls_encryption = document.getElementById('tls_encryption');
const tls_encryption_hint = document.getElementById('tls_encryption_hint');
const vault_url = document.getElementById('vault_url');
const db_warning = document.getElementById('db_warning');
const db_type = document.querySelector('[name=type]').value;
const host = document.querySelector('[name=server]').value;
const encryption_enabled = tls_encryption.checked;
const encryption_supported = (db_type === ZBX_DB_MYSQL || db_type === ZBX_DB_POSTGRESQL);
const encryption_allowed = (host !== ''
&& ((db_type === ZBX_DB_MYSQL && host !== 'localhost')
|| (db_type === ZBX_DB_POSTGRESQL && !host.startsWith('/'))));
const encryption_customizable = (encryption_supported && encryption_allowed && encryption_enabled
&& document.getElementById('verify_certificate').checked);
const vault_selected = parseInt(document.querySelector('input[name="creds_storage"]:checked').value);
const vault_enabled = [DB_STORE_CREDS_VAULT_HASHICORP, DB_STORE_CREDS_VAULT_CYBERARK].includes(vault_selected);
const vault_certificates_enabled = document.getElementById('vault_certificates_toggle').checked;
const rows = {
'db_schema_row': db_type === ZBX_DB_POSTGRESQL,
'db_encryption_row': encryption_supported,
'db_verify_host': encryption_supported && encryption_allowed && encryption_enabled,
'db_keyfile_row': encryption_customizable,
'db_certfile_row': encryption_customizable,
'db_cafile_row': encryption_customizable,
'db_verify_host_row': encryption_customizable,
'db_cipher_row': encryption_customizable && db_type === ZBX_DB_MYSQL,
'vault_url_row': vault_enabled,
'vault_db_path_row': vault_selected == DB_STORE_CREDS_VAULT_HASHICORP,
'vault_token_row': vault_selected == DB_STORE_CREDS_VAULT_HASHICORP,
'db_user': !vault_enabled,
'db_password': !vault_enabled,
'vault_query_string_row': vault_selected == DB_STORE_CREDS_VAULT_CYBERARK,
'vault_certificates': vault_selected == DB_STORE_CREDS_VAULT_CYBERARK,
'vault_cert_file': vault_selected == DB_STORE_CREDS_VAULT_CYBERARK && vault_certificates_enabled,
'vault_key_file': vault_selected == DB_STORE_CREDS_VAULT_CYBERARK && vault_certificates_enabled
};
for (let id in rows) {
const element = document.getElementById(id);
element.classList.toggle(ZBX_STYLE_DISPLAY_NONE, !rows[id]);
for (const input of element.querySelectorAll('input')) {
if (!rows[id]) {
input.setAttribute('disabled', 'disabled');
}
else {
input.removeAttribute('disabled');
}
}
}
if (vault_enabled
&& [this._hashicorp_endpoint_default, this._cyberark_endpoint_default].includes(vault_url.value)) {
vault_url.value = vault_selected == DB_STORE_CREDS_VAULT_CYBERARK
? this._cyberark_endpoint_default
: this._hashicorp_endpoint_default
}
// TLS encryption checkbox and secure connection hint message.
if (encryption_supported) {
if (!encryption_allowed) {
document.querySelector('input + [for=tls_encryption]').classList.add(ZBX_STYLE_DISPLAY_NONE);
tls_encryption.setAttribute('disabled', 'disabled');
tls_encryption_hint.classList.remove(ZBX_STYLE_DISPLAY_NONE);
}
else {
document.querySelector('input + [for=tls_encryption]').classList.remove(ZBX_STYLE_DISPLAY_NONE);
tls_encryption.removeAttribute('disabled');
tls_encryption_hint.classList.add(ZBX_STYLE_DISPLAY_NONE);
}
}
// Verify host checkbox availability.
if (db_type === ZBX_DB_MYSQL) {
verify_host.checked = true;
verify_host.setAttribute('checked', true);
verify_host.setAttribute('disabled', 'disabled');
}
else if (encryption_customizable) {
verify_host.removeAttribute('disabled');
}
db_warning.style.display = db_type === ZBX_DB_ORACLE ? '' : 'none';
}
};