<?php declare(strict_types = 0); /* ** Copyright (C) 2001-2025 Zabbix SIA ** ** This program is free software: you can redistribute it and/or modify it under the terms of ** the GNU Affero General Public License as published by the Free Software Foundation, version 3. ** ** 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 Affero General Public License for more details. ** ** You should have received a copy of the GNU Affero General Public License along with this program. ** If not, see <https://www.gnu.org/licenses/>. **/ class CControllerProxyUpdate extends CController { protected function init(): void { $this->setPostContentType(self::POST_CONTENT_TYPE_JSON); } protected function checkInput(): bool { $fields = [ 'proxyid' => 'required|db proxy.proxyid', 'name' => 'required|not_empty|db proxy.name', 'proxy_groupid' => 'db proxy.proxy_groupid', 'local_address' => 'db proxy.local_address', 'local_port' => 'db proxy.local_port', 'operating_mode' => 'required|db proxy.operating_mode|in '.implode(',', [PROXY_OPERATING_MODE_ACTIVE, PROXY_OPERATING_MODE_PASSIVE]), 'address' => 'db proxy.address', 'port' => 'db proxy.port', 'allowed_addresses' => 'db proxy.allowed_addresses', 'description' => 'db proxy.description', 'tls_connect' => 'db proxy.tls_connect|in '.implode(',', [HOST_ENCRYPTION_NONE, HOST_ENCRYPTION_PSK, HOST_ENCRYPTION_CERTIFICATE]), 'tls_accept_none' => 'in 1', 'tls_accept_psk' => 'in 1', 'tls_accept_certificate' => 'in 1', 'tls_psk_identity' => 'db proxy.tls_psk_identity', 'tls_psk' => 'db proxy.tls_psk', 'tls_issuer' => 'db proxy.tls_issuer', 'tls_subject' => 'db proxy.tls_subject', 'update_psk' => 'required|bool', 'custom_timeouts' => 'db proxy.custom_timeouts|in '.implode(',', [ZBX_PROXY_CUSTOM_TIMEOUTS_DISABLED, ZBX_PROXY_CUSTOM_TIMEOUTS_ENABLED]), 'timeout_zabbix_agent' => 'db proxy.timeout_zabbix_agent', 'timeout_simple_check' => 'db proxy.timeout_simple_check', 'timeout_snmp_agent' => 'db proxy.timeout_snmp_agent', 'timeout_external_check' => 'db proxy.timeout_external_check', 'timeout_db_monitor' => 'db proxy.timeout_db_monitor', 'timeout_http_agent' => 'db proxy.timeout_http_agent', 'timeout_ssh_agent' => 'db proxy.timeout_ssh_agent', 'timeout_telnet_agent' => 'db proxy.timeout_telnet_agent', 'timeout_script' => 'db proxy.timeout_script', 'timeout_browser' => 'db proxy.timeout_browser' ]; $ret = $this->validateInput($fields); if ($ret) { if ($this->getInput('proxy_groupid', 0) != 0) { if ($this->getInput('local_address', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _s('%1$s: %2$s', _('Address for active agents'), _('Address')), _('cannot be empty') )); $ret = false; } if ($this->getInput('local_port', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _s('%1$s: %2$s', _('Address for active agents'), _('Port')), _('cannot be empty') )); $ret = false; } } switch ($this->getInput('operating_mode')) { case PROXY_OPERATING_MODE_ACTIVE: if (!$this->hasInput('tls_accept_none') && !$this->hasInput('tls_accept_psk') && !$this->hasInput('tls_accept_certificate')) { info(_s('Incorrect value for field "%1$s": %2$s.', _('Connections from proxy'), _('cannot be empty') )); $ret = false; } break; case PROXY_OPERATING_MODE_PASSIVE: if ($this->getInput('address', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _s('%1$s: %2$s', _('Interface'), _('Address')), _('cannot be empty') )); $ret = false; } if ($this->getInput('port', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _s('%1$s: %2$s', _('Interface'), _('Port')), _('cannot be empty') )); $ret = false; } break; } if ($this->getInput('update_psk')) { if (($this->getInput('operating_mode') == PROXY_OPERATING_MODE_ACTIVE && $this->hasInput('tls_accept_psk')) || ($this->getInput('operating_mode') == PROXY_OPERATING_MODE_PASSIVE && $this->getInput('tls_connect', 0) == HOST_ENCRYPTION_PSK)) { if ($this->getInput('tls_psk_identity', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _('PSK identity'), _('cannot be empty'))); $ret = false; } if ($this->getInput('tls_psk', '') === '') { info(_s('Incorrect value for field "%1$s": %2$s.', _('PSK'), _('cannot be empty'))); $ret = false; } } } $custom_timeouts = $this->getInput('custom_timeouts', ZBX_PROXY_CUSTOM_TIMEOUTS_DISABLED); if ($custom_timeouts == ZBX_PROXY_CUSTOM_TIMEOUTS_ENABLED) { $fields = [ 'timeout_zabbix_agent' => 'required|not_empty', 'timeout_simple_check' => 'required|not_empty', 'timeout_snmp_agent' => 'required|not_empty', 'timeout_external_check' => 'required|not_empty', 'timeout_db_monitor' => 'required|not_empty', 'timeout_http_agent' => 'required|not_empty', 'timeout_ssh_agent' => 'required|not_empty', 'timeout_telnet_agent' => 'required|not_empty', 'timeout_script' => 'required|not_empty', 'timeout_browser' => 'required|not_empty' ]; $validator = new CNewValidator(array_intersect_key($this->getInputAll(), $fields), $fields); foreach ($validator->getAllErrors() as $error) { info($error); } $ret = !$validator->isErrorFatal() && !$validator->isError(); } } if (!$ret) { $this->setResponse( new CControllerResponseData(['main_block' => json_encode([ 'error' => [ 'title' => _('Cannot update proxy'), 'messages' => array_column(get_and_clear_messages(), 'message') ] ])]) ); } return $ret; } protected function checkPermissions(): bool { if (!$this->checkAccess(CRoleHelper::UI_ADMINISTRATION_PROXIES)) { return false; } return (bool) API::Proxy()->get([ 'output' => [], 'proxyids' => $this->getInput('proxyid'), 'editable' => true ]); } protected function doAction(): void { $proxy = []; $this->getInputs($proxy, ['proxyid', 'name', 'operating_mode', 'description', 'tls_connect', 'tls_psk_identity', 'tls_psk', 'tls_issuer', 'tls_subject' ]); $proxy['proxy_groupid'] = $this->getInput('proxy_groupid', 0); if ($proxy['proxy_groupid'] != 0) { $proxy['local_address'] = $this->getInput('local_address'); $proxy['local_port'] = $this->getInput('local_port'); } switch ($this->getInput('operating_mode')) { case PROXY_OPERATING_MODE_ACTIVE: $proxy['allowed_addresses'] = $this->getInput('allowed_addresses', ''); $proxy['tls_accept'] = ($this->hasInput('tls_accept_none') ? HOST_ENCRYPTION_NONE : 0) | ($this->hasInput('tls_accept_psk') ? HOST_ENCRYPTION_PSK : 0) | ($this->hasInput('tls_accept_certificate') ? HOST_ENCRYPTION_CERTIFICATE : 0); break; case PROXY_OPERATING_MODE_PASSIVE: $proxy['address'] = $this->getInput('address', ''); $proxy['port'] = $this->getInput('port', ''); break; } $proxy['custom_timeouts'] = $this->getInput('custom_timeouts', ZBX_PROXY_CUSTOM_TIMEOUTS_DISABLED); if ($proxy['custom_timeouts'] == ZBX_PROXY_CUSTOM_TIMEOUTS_ENABLED) { $this->getInputs($proxy, ['timeout_zabbix_agent', 'timeout_simple_check', 'timeout_snmp_agent', 'timeout_external_check', 'timeout_db_monitor', 'timeout_http_agent', 'timeout_ssh_agent', 'timeout_telnet_agent', 'timeout_script', 'timeout_browser' ]); } $result = API::Proxy()->update($proxy); $output = []; if ($result) { $output['success']['title'] = _('Proxy updated'); if ($messages = get_and_clear_messages()) { $output['success']['messages'] = array_column($messages, 'message'); } } else { $output['error'] = [ 'title' => _('Cannot update proxy'), 'messages' => array_column(get_and_clear_messages(), 'message') ]; } $this->setResponse(new CControllerResponseData(['main_block' => json_encode($output)])); } }