function delete_host_group($groupids) { zbx_value2array($groupids); if (empty($groupids)) { return true; } $dlt_groupids = getDeletableHostGroups($groupids); if (count($groupids) != count($dlt_groupids)) { foreach ($groupids as $num => $groupid) { if (!isset($dlt_groupids[$groupid])) { $group = get_hostgroup_by_groupid($groupid); if ($group['internal'] == ZBX_INTERNAL_GROUP) { error(S_GROUP . SPACE . '"' . $group['name'] . '"' . SPACE . S_INTERNAL_AND_CANNOT_DELETED_SMALL); } else { error(S_GROUP . SPACE . '"' . $group['name'] . '"' . SPACE . S_CANNOT_DELETED_INNER_HOSTS_CANNOT_UNLINKED_SMALL); } } } return false; } // check if hostgroup used in scripts $error = false; $sql = 'SELECT s.name AS script_name, g.name AS group_name ' . ' FROM scripts s, groups g' . ' WHERE ' . ' g.groupid = s.groupid ' . ' AND ' . DBcondition('s.groupid', $groupids); $res = DBselect($sql); while ($group = DBfetch($res)) { $error = true; error(sprintf(S_HOSTGROUP_CANNOT_BE_DELETED_USED_IN_SCRIPT, $group['group_name'], $group['script_name'])); } if ($error) { return false; } // delete screens items $resources = array(SCREEN_RESOURCE_HOSTGROUP_TRIGGERS, SCREEN_RESOURCE_HOSTS_INFO, SCREEN_RESOURCE_TRIGGERS_INFO, SCREEN_RESOURCE_TRIGGERS_OVERVIEW, SCREEN_RESOURCE_DATA_OVERVIEW); $sql = 'DELETE FROM screens_items ' . ' WHERE ' . DBcondition('resourceid', $groupids) . ' AND ' . DBcondition('resourcetype', $resources); DBexecute($sql); // delete sysmap element if (!delete_sysmaps_elements_with_groupid($groupids)) { return false; } // delete host from maintenances DBexecute('DELETE FROM maintenances_groups WHERE ' . DBcondition('groupid', $groupids)); // disable actions $actionids = array(); // conditions $sql = 'SELECT DISTINCT c.actionid ' . ' FROM conditions c ' . ' WHERE c.conditiontype=' . CONDITION_TYPE_HOST_GROUP . ' AND ' . DBcondition('c.value', $groupids, false, true); $db_actions = DBselect($sql); while ($db_action = DBfetch($db_actions)) { $actionids[$db_action['actionid']] = $db_action['actionid']; } // operations $sql = 'SELECT DISTINCT o.actionid ' . ' FROM operations o ' . ' WHERE o.operationtype IN (' . OPERATION_TYPE_GROUP_ADD . ',' . OPERATION_TYPE_GROUP_REMOVE . ') ' . ' AND ' . DBcondition('o.objectid', $groupids); $db_actions = DBselect($sql); while ($db_action = DBfetch($db_actions)) { $actionids[$db_action['actionid']] = $db_action['actionid']; } if (!empty($actionids)) { DBexecute('UPDATE actions ' . ' SET status=' . ACTION_STATUS_DISABLED . ' WHERE ' . DBcondition('actionid', $actionids)); } // delete action conditions DBexecute('DELETE FROM conditions' . ' WHERE conditiontype=' . CONDITION_TYPE_HOST_GROUP . ' AND ' . DBcondition('value', $groupids, false, true)); // delete action operations DBexecute('DELETE FROM operations ' . ' WHERE operationtype IN (' . OPERATION_TYPE_GROUP_ADD . ',' . OPERATION_TYPE_GROUP_REMOVE . ') ' . ' AND ' . DBcondition('objectid', $groupids)); DBexecute('DELETE FROM hosts_groups WHERE ' . DBcondition('groupid', $groupids)); foreach ($groupids as $id) { /* The section should be improved */ $hostgroup_old = get_hostgroup_by_groupid($id); $result = DBexecute('DELETE FROM groups WHERE groupid=' . $id); if ($result) { add_audit_ext(AUDIT_ACTION_DELETE, AUDIT_RESOURCE_HOST_GROUP, $id, $hostgroup_old['name'], 'groups', NULL, NULL); } else { break; } } return $result; }
} } // select selected hosts and add them $params = array('hostids' => $hosts, 'templated_hosts' => 1, 'order' => 'host', 'editable' => 1, 'extendoutput' => 1); $db_hosts = CHost::get($params); foreach ($db_hosts as $hostid => $db_host) { $cmbHosts->addItem($hostid, get_node_name_by_elid($hostid) . $db_host['host']); } $frmHostG->addRow(S_HOSTS, $cmbHosts->Get(S_HOSTS . SPACE . S_IN, array(S_OTHER . SPACE . S_HOSTS . SPACE . '|' . SPACE . S_GROUP . SPACE, $cmbGroups))); $frmHostG->addItemToBottomRow(new CButton('save', S_SAVE)); if ($groupid > 0) { $frmHostG->addItemToBottomRow(SPACE); $frmHostG->addItemToBottomRow(new CButton('clone', S_CLONE)); $frmHostG->addItemToBottomRow(SPACE); $dltButton = new CButtonDelete('Delete selected group?', url_param('form') . url_param('config') . url_param('groupid')); $dlt_groups = getDeletableHostGroups($_REQUEST['groupid']); if (empty($dlt_groups)) { $dltButton->setAttribute('disabled', 'disabled'); } $frmHostG->addItemToBottomRow($dltButton); } $frmHostG->addItemToBottomRow(SPACE); $frmHostG->addItemToBottomRow(new CButtonCancel(url_param('config'))); $frmHostG->show(); } else { $config = select_config(); $numrows = new CSpan(null, 'info'); $numrows->setAttribute('name', 'numrows'); $header = get_table_header(array(S_HOST_GROUPS_BIG, new CSpan(SPACE . SPACE . '|' . SPACE . SPACE, 'divider'), S_FOUND . ': ', $numrows)); show_table_header($header); $form = new CForm('hostgroups.php');
/** * Delete host groups. * * @param array $groupids * * @return boolean */ public function delete($groupids) { if (empty($groupids)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty input parameter.')); } $groupids = zbx_toArray($groupids); $options = array('groupids' => $groupids, 'editable' => true, 'output' => API_OUTPUT_EXTEND, 'preservekeys' => true); $delGroups = $this->get($options); foreach ($groupids as $groupid) { if (!isset($delGroups[$groupid])) { self::exception(ZBX_API_ERROR_PERMISSIONS, _('You do not have permission to perform this operation.')); } if ($delGroups[$groupid]['internal'] == ZBX_INTERNAL_GROUP) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Group "%1$s" is internal and can not be deleted.', $delGroups[$groupid]['name'])); } } $dltGroupids = getDeletableHostGroups($groupids); if (count($groupids) != count($dltGroupids)) { foreach ($groupids as $groupid) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Group "%s" cannot be deleted, because some hosts depend on it.', $delGroups[$groupid]['name'])); } } $dbScripts = API::Script()->get(array('groupids' => $groupids, 'output' => array('scriptid', 'groupid'), 'nopermissions' => true)); if (!empty($dbScripts)) { foreach ($dbScripts as $script) { if ($script['groupid'] == 0) { continue; } self::exception(ZBX_API_ERROR_PARAMETERS, _s('Group "%s" cannot be deleted, because it is used in a global script.', $delGroups[$script['groupid']]['name'])); } } // delete screens items $resources = array(SCREEN_RESOURCE_HOSTGROUP_TRIGGERS, SCREEN_RESOURCE_HOSTS_INFO, SCREEN_RESOURCE_TRIGGERS_INFO, SCREEN_RESOURCE_TRIGGERS_OVERVIEW, SCREEN_RESOURCE_DATA_OVERVIEW); DB::delete('screens_items', array('resourceid' => $groupids, 'resourcetype' => $resources)); // delete sysmap element if (!empty($groupids)) { DB::delete('sysmaps_elements', array('elementtype' => SYSMAP_ELEMENT_TYPE_HOST_GROUP, 'elementid' => $groupids)); } // disable actions // actions from conditions $actionids = array(); $dbActions = DBselect('SELECT DISTINCT c.actionid' . ' FROM conditions c' . ' WHERE c.conditiontype=' . CONDITION_TYPE_HOST_GROUP . ' AND ' . dbConditionString('c.value', $groupids)); while ($dbAction = DBfetch($dbActions)) { $actionids[$dbAction['actionid']] = $dbAction['actionid']; } // actions from operations $dbActions = DBselect('SELECT DISTINCT o.actionid' . ' FROM operations o,opgroup og' . ' WHERE o.operationid=og.operationid' . ' AND ' . dbConditionInt('og.groupid', $groupids)); while ($dbAction = DBfetch($dbActions)) { $actionids[$dbAction['actionid']] = $dbAction['actionid']; } if (!empty($actionids)) { $update = array(); $update[] = array('values' => array('status' => ACTION_STATUS_DISABLED), 'where' => array('actionid' => $actionids)); DB::update('actions', $update); } // delete action conditions DB::delete('conditions', array('conditiontype' => CONDITION_TYPE_HOST_GROUP, 'value' => $groupids)); // delete action operation commands $operationids = array(); $dbOperations = DBselect('SELECT DISTINCT og.operationid' . ' FROM opgroup og' . ' WHERE ' . dbConditionInt('og.groupid', $groupids)); while ($dbOperation = DBfetch($dbOperations)) { $operationids[$dbOperation['operationid']] = $dbOperation['operationid']; } DB::delete('opgroup', array('groupid' => $groupids)); // delete empty operations $delOperationids = array(); $dbOperations = DBselect('SELECT DISTINCT o.operationid' . ' FROM operations o' . ' WHERE ' . dbConditionInt('o.operationid', $operationids) . ' AND NOT EXISTS (SELECT NULL FROM opgroup og WHERE o.operationid=og.operationid)'); while ($dbOperation = DBfetch($dbOperations)) { $delOperationids[$dbOperation['operationid']] = $dbOperation['operationid']; } DB::delete('operations', array('operationid' => $delOperationids)); // host groups DB::delete('groups', array('groupid' => $groupids)); // TODO: remove audit foreach ($groupids as $groupid) { add_audit_ext(AUDIT_ACTION_DELETE, AUDIT_RESOURCE_HOST_GROUP, $groupid, $delGroups[$groupid]['name'], 'groups', null, null); } return array('groupids' => $groupids); }
// get all hosts from all groups $options = array('templated_hosts' => 1, 'sortfield' => 'name', 'editable' => 1, 'output' => API_OUTPUT_EXTEND); } else { // get hosts from selected twb_groupid combo $options = array('groupids' => $data['twb_groupid'], 'templated_hosts' => 1, 'sortfield' => 'name', 'editable' => 1, 'output' => API_OUTPUT_EXTEND); } $data['db_hosts'] = API::Host()->get($options); // get selected hosts $options = array('hostids' => $data['hosts'], 'templated_hosts' => 1, 'sortfield' => 'name', 'output' => API_OUTPUT_EXTEND); $data['r_hosts'] = API::Host()->get($options); // get hosts ids $options = array('hostids' => $data['hosts'], 'templated_hosts' => 1, 'editable' => 1, 'output' => API_OUTPUT_SHORTEN); $data['rw_hosts'] = API::Host()->get($options); $data['rw_hosts'] = zbx_toHash($data['rw_hosts'], 'hostid'); if (!empty($data['groupid'])) { $data['deletableHostGroups'] = getDeletableHostGroups($data['groupid']); } // render view $hostgroupView = new CView('configuration.hostgroups.edit', $data); $hostgroupView->render(); $hostgroupView->show(); } else { $data['config'] = $config; $sortfield = getPageSortField('name'); $sortorder = getPageSortOrder(); $options = array('editable' => 1, 'output' => API_OUTPUT_SHORTEN, 'sortfield' => $sortfield, 'limit' => $config['search_limit'] + 1); $groups = API::HostGroup()->get($options); $data['paging'] = getPagingLine($groups); // get hosts and templates count $options = array('groupids' => zbx_objectValues($groups, 'groupid'), 'selectHosts' => API_OUTPUT_COUNT, 'selectTemplates' => API_OUTPUT_COUNT, 'nopermissions' => 1); $data['groupCounts'] = API::HostGroup()->get($options);
function delete_host_group($groupids) { zbx_value2array($groupids); if (empty($groupids)) { return true; } $dlt_groupids = getDeletableHostGroups($groupids); if (count($groupids) != count($dlt_groupids)) { foreach ($groupids as $num => $groupid) { if (!isset($dlt_groupids[$groupid])) { $group = get_hostgroup_by_groupid($groupid); if ($group['internal'] == ZBX_INTERNAL_GROUP) { error('Group "' . $group['name'] . '" is internal and can not be deleted'); } else { error('Group "' . $group['name'] . '" can not be deleted, due to inner hosts can not be unlinked'); } } } return false; } // delete sysmap element if (!delete_sysmaps_elements_with_groupid($groupids)) { return false; } // delete host from maintenances DBexecute('DELETE FROM maintenances_groups WHERE ' . DBcondition('groupid', $groupids)); // disable actions $actionids = array(); // conditions $sql = 'SELECT DISTINCT c.actionid ' . ' FROM conditions c ' . ' WHERE c.conditiontype=' . CONDITION_TYPE_HOST_GROUP . ' AND ' . DBcondition('c.value', $groupids, false, true); $db_actions = DBselect($sql); while ($db_action = DBfetch($db_actions)) { $actionids[$db_action['actionid']] = $db_action['actionid']; } // operations $sql = 'SELECT DISTINCT o.actionid ' . ' FROM operations o ' . ' WHERE o.operationtype IN (' . OPERATION_TYPE_GROUP_ADD . ',' . OPERATION_TYPE_GROUP_REMOVE . ') ' . ' AND ' . DBcondition('o.objectid', $groupids); $db_actions = DBselect($sql); while ($db_action = DBfetch($db_actions)) { $actionids[$db_action['actionid']] = $db_action['actionid']; } if (!empty($actionids)) { DBexecute('UPDATE actions ' . ' SET status=' . ACTION_STATUS_DISABLED . ' WHERE ' . DBcondition('actionid', $actionids)); } // delete action conditions DBexecute('DELETE FROM conditions' . ' WHERE conditiontype=' . CONDITION_TYPE_HOST_GROUP . ' AND ' . DBcondition('value', $groupids, false, true)); // delete action operations DBexecute('DELETE FROM operations ' . ' WHERE operationtype IN (' . OPERATION_TYPE_GROUP_ADD . ',' . OPERATION_TYPE_GROUP_REMOVE . ') ' . ' AND ' . DBcondition('objectid', $groupids)); DBexecute('DELETE FROM hosts_groups WHERE ' . DBcondition('groupid', $groupids)); foreach ($groupids as $id) { /* The section should be improved */ $hostgroup_old = get_hostgroup_by_groupid($id); $result = DBexecute('DELETE FROM groups WHERE groupid=' . $id); if ($result) { add_audit_ext(AUDIT_ACTION_DELETE, AUDIT_RESOURCE_HOST_GROUP, $id, $hostgroup_old['name'], 'groups', NULL, NULL); } else { break; } } return $result; }