Exemplo n.º 1
0
 /**
  * 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);
 }
Exemplo n.º 2
0
 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']));
     }
 }