order_result($data['db_groups'], 'name'); if ($data['twb_groupid'] == -1) { $dbGroup = reset($data['db_groups']); $data['twb_groupid'] = $dbGroup['groupid']; } // get all possible hosts $data['db_hosts'] = API::Host()->get(array('output' => array('hostid', 'name'), 'groupids' => $data['twb_groupid'] ? $data['twb_groupid'] : null, 'templated_hosts' => true, 'editable' => true, 'filter' => array('flags' => ZBX_FLAG_DISCOVERY_NORMAL))); order_result($data['db_hosts'], 'name'); // get selected hosts if ($data['hosts']) { $data['r_hosts'] = API::Host()->get(array('output' => array('hostid', 'name', 'flags'), 'hostids' => $data['hosts'], 'templated_hosts' => true, 'preservekeys' => true)); order_result($data['r_hosts'], 'name'); } // deletable groups if ($data['groupid'] != 0) { $data['deletableHostGroups'] = getDeletableHostGroupIds(array($data['groupid'])); } // render view $hostgroupView = new CView('configuration.hostgroups.edit', $data); $hostgroupView->render(); $hostgroupView->show(); } else { $sortField = getRequest('sort', CProfile::get('web.' . $page['file'] . '.sort', 'name')); $sortOrder = getRequest('sortorder', CProfile::get('web.' . $page['file'] . '.sortorder', ZBX_SORT_UP)); CProfile::update('web.' . $page['file'] . '.sort', $sortField, PROFILE_TYPE_STR); CProfile::update('web.' . $page['file'] . '.sortorder', $sortOrder, PROFILE_TYPE_STR); $data = array('config' => $config, 'sort' => $sortField, 'sortorder' => $sortOrder); $groups = API::HostGroup()->get(array('output' => array('groupid', $sortField), 'editable' => true, 'sortfield' => $sortField, 'limit' => $config['search_limit'] + 1)); order_result($groups, $sortField, $sortOrder); $data['paging'] = getPagingLine($groups, $sortOrder); $groupIds = zbx_objectValues($groups, 'groupid');
/** * Delete host groups. * * @param array $groupids * @param bool $nopermissions * * @return array */ public function delete(array $groupids, $nopermissions = false) { if (empty($groupids)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty input parameter.')); } sort($groupids); $delGroups = $this->get(array('groupids' => $groupids, 'editable' => true, 'output' => array('groupid', 'name', 'internal'), 'preservekeys' => true, 'nopermissions' => $nopermissions)); foreach ($groupids as $groupid) { if (!isset($delGroups[$groupid])) { self::exception(ZBX_API_ERROR_PERMISSIONS, _('No permissions to referred object or it does not exist!')); } if ($delGroups[$groupid]['internal'] == ZBX_INTERNAL_GROUP) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Host group "%1$s" is internal and can not be deleted.', $delGroups[$groupid]['name'])); } } // check if a group is used in a group prototype $groupPrototype = DBFetch(DBselect('SELECT groupid' . ' FROM group_prototype gp' . ' WHERE ' . dbConditionInt('groupid', $groupids), 1)); if ($groupPrototype) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Group "%1$s" cannot be deleted, because it is used by a host prototype.', $delGroups[$groupPrototype['groupid']]['name'])); } $dltGroupids = getDeletableHostGroupIds($groupids); if (count($groupids) != count($dltGroupids)) { foreach ($groupids as $groupid) { if (isset($dltGroupids[$groupid])) { continue; } self::exception(ZBX_API_ERROR_PARAMETERS, _s('Host group "%1$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('Host group "%1$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)); DB::delete('groups', array('groupid' => $groupids)); DB::delete('profiles', array('idx' => 'web.dashconf.groups.groupids', 'value_id' => $groupids)); DB::delete('profiles', array('idx' => 'web.dashconf.groups.hide.groupids', 'value_id' => $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); }
order_result($data['db_groups'], 'name'); if ($data['twb_groupid'] == -1) { $dbGroup = reset($data['db_groups']); $data['twb_groupid'] = $dbGroup['groupid']; } // get all possible hosts $data['db_hosts'] = API::Host()->get(['output' => ['hostid', 'name'], 'groupids' => $data['twb_groupid'] ? $data['twb_groupid'] : null, 'templated_hosts' => true, 'editable' => true, 'filter' => ['flags' => ZBX_FLAG_DISCOVERY_NORMAL]]); order_result($data['db_hosts'], 'name'); // get selected hosts if ($data['hosts']) { $data['r_hosts'] = API::Host()->get(['output' => ['hostid', 'name', 'flags'], 'hostids' => $data['hosts'], 'templated_hosts' => true, 'preservekeys' => true]); order_result($data['r_hosts'], 'name'); } // deletable groups if ($data['groupid'] != 0) { $data['deletableHostGroups'] = getDeletableHostGroupIds([$data['groupid']]); } // render view $hostgroupView = new CView('configuration.hostgroups.edit', $data); $hostgroupView->render(); $hostgroupView->show(); } else { $sortField = getRequest('sort', CProfile::get('web.' . $page['file'] . '.sort', 'name')); $sortOrder = getRequest('sortorder', CProfile::get('web.' . $page['file'] . '.sortorder', ZBX_SORT_UP)); CProfile::update('web.' . $page['file'] . '.sort', $sortField, PROFILE_TYPE_STR); CProfile::update('web.' . $page['file'] . '.sortorder', $sortOrder, PROFILE_TYPE_STR); $config = select_config(); $data = ['sort' => $sortField, 'sortorder' => $sortOrder, 'config' => $config]; $groups = API::HostGroup()->get(['output' => ['groupid', $sortField], 'editable' => true, 'sortfield' => $sortField, 'limit' => $config['search_limit'] + 1]); order_result($groups, $sortField, $sortOrder); $data['paging'] = getPagingLine($groups, $sortOrder, new CUrl('hostgroups.php'));