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.
215 lines
6.8 KiB
215 lines
6.8 KiB
1 year ago
|
<?php declare(strict_types = 0);
|
||
|
/*
|
||
|
** 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 CControllerPopupActionEdit extends CController {
|
||
|
|
||
|
/**
|
||
|
* @var mixed
|
||
|
*/
|
||
|
private $action;
|
||
|
|
||
|
protected function init() {
|
||
|
$this->disableCsrfValidation();
|
||
|
}
|
||
|
|
||
|
protected function checkInput(): bool {
|
||
|
$fields = [
|
||
|
'eventsource' => 'required|db actions.eventsource|in '.implode(',', [
|
||
|
EVENT_SOURCE_TRIGGERS, EVENT_SOURCE_DISCOVERY, EVENT_SOURCE_AUTOREGISTRATION,
|
||
|
EVENT_SOURCE_INTERNAL, EVENT_SOURCE_SERVICE
|
||
|
]),
|
||
|
'actionid' => 'db actions.actionid'
|
||
|
];
|
||
|
|
||
|
$ret = $this->validateInput($fields);
|
||
|
|
||
|
if (!$ret) {
|
||
|
$this->setResponse(new CControllerResponseFatal());
|
||
|
}
|
||
|
|
||
|
return $ret;
|
||
|
}
|
||
|
|
||
|
protected function checkPermissions(): bool {
|
||
|
switch ($this->getInput('eventsource')) {
|
||
|
case EVENT_SOURCE_TRIGGERS:
|
||
|
$has_permission = $this->checkAccess(CRoleHelper::UI_CONFIGURATION_TRIGGER_ACTIONS);
|
||
|
break;
|
||
|
|
||
|
case EVENT_SOURCE_DISCOVERY:
|
||
|
$has_permission = $this->checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY_ACTIONS);
|
||
|
break;
|
||
|
|
||
|
case EVENT_SOURCE_AUTOREGISTRATION:
|
||
|
$has_permission = $this->checkAccess(CRoleHelper::UI_CONFIGURATION_AUTOREGISTRATION_ACTIONS);
|
||
|
break;
|
||
|
|
||
|
case EVENT_SOURCE_INTERNAL:
|
||
|
$has_permission = $this->checkAccess(CRoleHelper::UI_CONFIGURATION_INTERNAL_ACTIONS);
|
||
|
break;
|
||
|
|
||
|
case EVENT_SOURCE_SERVICE:
|
||
|
$has_permission = $this->checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICE_ACTIONS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!$has_permission) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$this->action = null;
|
||
|
|
||
|
if ($this->hasInput('actionid')) {
|
||
|
$operation_options = [
|
||
|
'operationtype', 'opcommand', 'opcommand_grp', 'opcommand_hst', 'opmessage', 'opmessage_usr',
|
||
|
'opmessage_grp'
|
||
|
];
|
||
|
|
||
|
$db_actions = API::Action()->get([
|
||
|
'output' => ['actionid', 'name', 'esc_period', 'eventsource', 'status', 'pause_suppressed',
|
||
|
'notify_if_canceled', 'pause_symptoms'
|
||
|
],
|
||
|
'actionids' => $this->getInput('actionid'),
|
||
|
'selectOperations' => ['operationtype', 'esc_step_from', 'esc_step_to', 'esc_period', 'evaltype',
|
||
|
'opcommand', 'opcommand_grp', 'opcommand_hst', 'opgroup', 'opmessage', 'optemplate', 'opinventory',
|
||
|
'opconditions', 'opmessage_usr', 'opmessage_grp', 'optag'
|
||
|
],
|
||
|
'selectRecoveryOperations' => $operation_options,
|
||
|
'selectUpdateOperations' => $operation_options,
|
||
|
'selectFilter' => ['conditions', 'formula', 'evaltype']
|
||
|
]);
|
||
|
|
||
|
if (!$db_actions) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$db_action = reset($db_actions);
|
||
|
|
||
|
if ($db_action['eventsource'] != $this->getInput('eventsource')) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$this->action = $db_action;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
protected function doAction(): void {
|
||
|
$eventsource = $this->getInput('eventsource', EVENT_SOURCE_TRIGGERS);
|
||
|
|
||
|
if ($this->action !== null) {
|
||
|
$formula = array_key_exists('formula', $this->action['filter']) ? $this->action['filter']['formula'] : '';
|
||
|
|
||
|
$data = [
|
||
|
'eventsource' => $eventsource,
|
||
|
'actionid' => $this->action['actionid'],
|
||
|
'action' => [
|
||
|
'name' => $this->action['name'],
|
||
|
'esc_period' => $this->action['esc_period'],
|
||
|
'eventsource' => $eventsource,
|
||
|
'status' => $this->action['status'],
|
||
|
'operations' => $this->action['operations'],
|
||
|
'recovery_operations' => $this->action['recovery_operations'],
|
||
|
'update_operations' => $this->action['update_operations'],
|
||
|
'filter' => $this->action['filter'],
|
||
|
'pause_symptoms' => $this->action['pause_symptoms'],
|
||
|
'pause_suppressed' => $this->action['pause_suppressed'],
|
||
|
'notify_if_canceled' => $this->action['notify_if_canceled']
|
||
|
],
|
||
|
'formula' => $formula,
|
||
|
'allowedOperations' => getAllowedOperations($eventsource)
|
||
|
];
|
||
|
|
||
|
CArrayHelper::sort($data['action']['filter']['conditions'], [
|
||
|
['field' => 'conditiontype', 'order' => ZBX_SORT_DOWN],
|
||
|
['field' => 'value', 'order' => ZBX_SORT_DOWN]
|
||
|
]);
|
||
|
|
||
|
$data['action']['filter']['conditions'] = array_values($data['action']['filter']['conditions']);
|
||
|
|
||
|
if ($data['action']['filter']['formula'] !== '') {
|
||
|
$data['action']['filter']['conditions'] = array_values(CConditionHelper::sortConditionsByFormulaId(
|
||
|
$data['action']['filter']['conditions']
|
||
|
));
|
||
|
}
|
||
|
|
||
|
foreach ($data['action']['filter']['conditions'] as $row_index => &$condition) {
|
||
|
$condition_names = actionConditionValueToString([$data['action']]);
|
||
|
$data['condition_name'][] = $condition_names[0][$row_index];
|
||
|
$condition += [
|
||
|
'row_index' => $row_index,
|
||
|
'name' => $condition_names[0][$row_index]
|
||
|
];
|
||
|
}
|
||
|
unset($condition);
|
||
|
|
||
|
sortOperations($eventsource, $data['action']['operations']);
|
||
|
|
||
|
foreach ($data['action']['operations'] as &$operation) {
|
||
|
$operation['recovery'] = ACTION_OPERATION;
|
||
|
$data['descriptions']['operation'] = getActionOperationData($data['action']['operations']);
|
||
|
}
|
||
|
unset($operation);
|
||
|
|
||
|
foreach ($data['action']['recovery_operations'] as &$operation) {
|
||
|
$operation['recovery'] = ACTION_RECOVERY_OPERATION;
|
||
|
$data['descriptions']['recovery'] = getActionOperationData($data['action']['recovery_operations']);
|
||
|
}
|
||
|
unset($operation);
|
||
|
|
||
|
foreach ($data['action']['update_operations'] as &$operation) {
|
||
|
$operation['recovery'] = ACTION_UPDATE_OPERATION;
|
||
|
$data['descriptions']['update'] = getActionOperationData($data['action']['update_operations']);
|
||
|
}
|
||
|
unset($operation);
|
||
|
}
|
||
|
else {
|
||
|
$data = [
|
||
|
'eventsource' => $eventsource,
|
||
|
'actionid' => $this->getInput('actionid', 0),
|
||
|
'action' => [
|
||
|
'name' => '',
|
||
|
'esc_period' => DB::getDefault('actions', 'esc_period'),
|
||
|
'eventsource' => $eventsource,
|
||
|
'status' => 0,
|
||
|
'operations' => [],
|
||
|
'recovery_operations' => [],
|
||
|
'update_operations' => [],
|
||
|
'filter' => [
|
||
|
'conditions' => [],
|
||
|
'evaltype' => ''
|
||
|
],
|
||
|
'pause_symptoms' => ACTION_PAUSE_SYMPTOMS_TRUE,
|
||
|
'pause_suppressed' => ACTION_PAUSE_SUPPRESSED_TRUE,
|
||
|
'notify_if_canceled' => ACTION_NOTIFY_IF_CANCELED_TRUE
|
||
|
],
|
||
|
'formula' => $this->getInput('formula', ''),
|
||
|
'allowedOperations' => getAllowedOperations($eventsource)
|
||
|
];
|
||
|
}
|
||
|
$data['user'] = ['debug_mode' => $this->getDebugMode()];
|
||
|
|
||
|
$response = new CControllerResponseData($data);
|
||
|
$this->setResponse($response);
|
||
|
}
|
||
|
}
|