/** * Update actions * * @param array $actions multidimensional array with actions data * @param array $actions[0,...]['actionid'] * @param array $actions[0,...]['expression'] * @param array $actions[0,...]['description'] * @param array $actions[0,...]['type'] OPTIONAL * @param array $actions[0,...]['priority'] OPTIONAL * @param array $actions[0,...]['status'] OPTIONAL * @param array $actions[0,...]['comments'] OPTIONAL * @param array $actions[0,...]['url'] OPTIONAL * @param array $actions[0,...]['filter'] OPTIONAL * @return boolean */ public function update($actions) { $actions = zbx_toArray($actions); $actions = zbx_toHash($actions, 'actionid'); $actionIds = array_keys($actions); $actionsDb = $this->get(array('actionids' => $actionIds, 'editable' => true, 'output' => API_OUTPUT_EXTEND, 'preservekeys' => true, 'selectOperations' => API_OUTPUT_EXTEND, 'selectFilter' => array('formula', 'conditions'))); $this->validateUpdate($actions, $actionsDb); $operationsToCreate = array(); $operationsToUpdate = array(); $operationIdsForDelete = array(); $actionsUpdateData = array(); $newActionConditions = null; foreach ($actions as $actionId => $action) { $actionDb = $actionsDb[$actionId]; $actionUpdateValues = $action; unset($actionUpdateValues['actionid'], $actionUpdateValues['filter'], $actionUpdateValues['operations'], $actionUpdateValues['conditions'], $actionUpdateValues['formula'], $actionUpdateValues['evaltype']); if (isset($action['filter'])) { $actionFilter = $action['filter']; // set formula to empty string of not custom expression if ($actionFilter['evaltype'] != CONDITION_EVAL_TYPE_EXPRESSION) { $actionUpdateValues['formula'] = ''; } $actionUpdateValues['evaltype'] = $actionFilter['evaltype']; } if (isset($action['operations'])) { $operationsDb = $actionDb['operations']; $operationsDb = zbx_toHash($operationsDb, 'operationid'); foreach ($action['operations'] as $operation) { if (!isset($operation['operationid'])) { $operation['actionid'] = $action['actionid']; $operationsToCreate[] = $operation; } else { $operationId = $operation['operationid']; if (isset($operationsDb[$operationId])) { $operationsToUpdate[] = $operation; unset($operationsDb[$operationId]); } } } $operationIdsForDelete = array_merge($operationIdsForDelete, array_keys($operationsDb)); } $actionsUpdateData[] = array('values' => $actionUpdateValues, 'where' => array('actionid' => $actionId)); } if ($actionsUpdateData) { DB::update('actions', $actionsUpdateData); } // add, update and delete operations $this->addOperations($operationsToCreate); $this->updateOperations($operationsToUpdate, $actionsDb); if (!empty($operationIdsForDelete)) { $this->deleteOperations($operationIdsForDelete); } // set actionid for all conditions and group by actionid into $newActionConditions $newActionConditions = null; foreach ($actions as $actionId => $action) { if (isset($action['filter'])) { if ($newActionConditions === null) { $newActionConditions = array(); } $newActionConditions[$actionId] = array(); foreach ($action['filter']['conditions'] as $condition) { $condition['actionid'] = $actionId; $newActionConditions[$actionId][] = $condition; } } } // if we have any conditions, fetch current conditions from db and do replace by position and group result // by actionid into $actionConditions $actionConditions = array(); if ($newActionConditions !== null) { $existingConditions = DBfetchArray(DBselect('SELECT conditionid,actionid,conditiontype,operator,value' . ' FROM conditions' . ' WHERE ' . dbConditionInt('actionid', $actionIds) . ' ORDER BY conditionid')); $existingActionConditions = array(); foreach ($existingConditions as $condition) { $existingActionConditions[$condition['actionid']][] = $condition; } $conditions = DB::replaceByPosition('conditions', $existingActionConditions, $newActionConditions); foreach ($conditions as $condition) { $actionConditions[$condition['actionid']][] = $condition; } } // update formulas for user expressions using new conditions foreach ($actions as $actionId => $action) { if (isset($action['filter']) && $action['filter']['evaltype'] == CONDITION_EVAL_TYPE_EXPRESSION) { $this->updateFormula($actionId, $action['filter']['formula'], $actionConditions[$actionId]); } } return array('actionids' => $actionIds); }
protected function updateReal($items) { $items = zbx_toArray($items); $ruleIds = zbx_objectValues($items, 'itemid'); $exRules = $this->get(array('itemids' => $ruleIds, 'output' => array('key_', 'name'), 'selectHosts' => array('name'), 'selectFilter' => array('evaltype'), 'nopermissions' => true, 'preservekeys' => true)); $data = array(); foreach ($items as $item) { $values = $item; if (isset($item['filter'])) { // clear the formula for non-custom expression rules if ($item['filter']['evaltype'] != CONDITION_EVAL_TYPE_EXPRESSION) { $values['formula'] = ''; } $values['evaltype'] = $item['filter']['evaltype']; unset($values['filter']); } $data[] = array('values' => $values, 'where' => array('itemid' => $item['itemid'])); } DB::update('items', $data); $newRuleConditions = null; foreach ($items as $item) { // conditions if (isset($item['filter'])) { if ($newRuleConditions === null) { $newRuleConditions = array(); } $newRuleConditions[$item['itemid']] = array(); foreach ($item['filter']['conditions'] as $condition) { $condition['itemid'] = $item['itemid']; $newRuleConditions[$item['itemid']][] = $condition; } } } // replace conditions $ruleConditions = array(); if ($newRuleConditions !== null) { // fetch existing conditions $exConditions = DBfetchArray(DBselect('SELECT item_conditionid,itemid,macro,value,operator' . ' FROM item_condition' . ' WHERE ' . dbConditionInt('itemid', $ruleIds) . ' ORDER BY item_conditionid')); $exRuleConditions = array(); foreach ($exConditions as $condition) { $exRuleConditions[$condition['itemid']][] = $condition; } // replace and add the new IDs $conditions = DB::replaceByPosition('item_condition', $exRuleConditions, $newRuleConditions); foreach ($conditions as $condition) { $ruleConditions[$condition['itemid']][] = $condition; } } // update formulas foreach ($items as $item) { if (isset($item['filter']) && $item['filter']['evaltype'] == CONDITION_EVAL_TYPE_EXPRESSION) { $this->updateFormula($item['itemid'], $item['filter']['formula'], $ruleConditions[$item['itemid']]); } } // TODO: REMOVE info foreach ($exRules as $item) { $host = reset($item['hosts']); info(_s('Updated: Discovery rule "%1$s" on "%2$s".', $item['name'], $host['name'])); } }