"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCollectorPackagePolicy = createCollectorPackagePolicy; exports.createSymbolizerPackagePolicy = createSymbolizerPackagePolicy; exports.generateSecretToken = generateSecretToken; exports.getCollectorPolicy = getCollectorPolicy; exports.getSymbolizerPolicy = getSymbolizerPolicy; exports.getVarsFor = getVarsFor; exports.removeProfilingFromApmPackagePolicy = removeProfilingFromApmPackagePolicy; exports.validateCollectorPackagePolicy = validateCollectorPackagePolicy; exports.validateProfilingInApmPackagePolicy = validateProfilingInApmPackagePolicy; exports.validateSymbolizerPackagePolicy = validateSymbolizerPackagePolicy; var _registry = require("@kbn/fleet-plugin/server/services/epm/registry"); var _lodash = require("lodash"); var _common = require("@kbn/fleet-plugin/common"); var _get_apm_policy = require("./get_apm_policy"); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ const CLOUD_AGENT_POLICY_ID = 'policy-elastic-agent-on-cloud'; const COLLECTOR_PACKAGE_POLICY_NAME = 'elastic-universal-profiling-collector'; const SYMBOLIZER_PACKAGE_POLICY_NAME = 'elastic-universal-profiling-symbolizer'; async function getPackagePolicy({ soClient, packagePolicyClient, packageName }) { const packagePolicies = await packagePolicyClient.list(soClient, { kuery: `${_common.PACKAGE_POLICY_SAVED_OBJECT_TYPE}.name:${packageName}` }); return packagePolicies.items[0]; } async function getCollectorPolicy({ soClient, packagePolicyClient }) { return getPackagePolicy({ soClient, packagePolicyClient, packageName: COLLECTOR_PACKAGE_POLICY_NAME }); } async function validateCollectorPackagePolicy({ soClient, packagePolicyClient }) { const collectorPolicy = await getCollectorPolicy({ soClient, packagePolicyClient }); return { policies: { collector: { installed: !!collectorPolicy } } }; } function generateSecretToken() { let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (let i = 0; i < 16; i++) { const randomIndex = Math.floor(Math.random() * characters.length); result += characters.charAt(randomIndex); } return result; } function getVarsFor({ config, includeSecretToken }) { const configKeys = Object.keys(config); if (includeSecretToken) { configKeys.push('secret_token'); } return configKeys.reduce((acc, currKey) => { const value = currKey === 'secret_token' ? generateSecretToken() : config[currKey]; const type = typeof value === 'boolean' ? 'bool' : 'text'; return { ...acc, [currKey]: { type, value } }; }, {}); } async function createCollectorPackagePolicy({ client, soClient, packagePolicyClient, config }) { const packageName = 'profiler_collector'; const { version } = await (0, _registry.fetchFindLatestPackageOrThrow)(packageName, { prerelease: true }); const packagePolicy = { policy_id: CLOUD_AGENT_POLICY_ID, enabled: true, package: { name: packageName, title: 'Universal Profiling Collector', version }, name: COLLECTOR_PACKAGE_POLICY_NAME, namespace: 'default', inputs: [{ policy_template: 'universal_profiling_collector', enabled: true, streams: [], type: 'pf-elastic-collector', vars: config !== null && config !== void 0 && config.collector ? getVarsFor({ config: config.collector, includeSecretToken: true }) : {} }] }; const esClient = client.getEsClient(); await packagePolicyClient.create(soClient, esClient, packagePolicy, { force: true }); } async function getSymbolizerPolicy({ soClient, packagePolicyClient }) { return getPackagePolicy({ soClient, packagePolicyClient, packageName: SYMBOLIZER_PACKAGE_POLICY_NAME }); } async function validateSymbolizerPackagePolicy({ soClient, packagePolicyClient }) { const symbolizerPackagePolicy = await getSymbolizerPolicy({ soClient, packagePolicyClient }); return { policies: { symbolizer: { installed: !!symbolizerPackagePolicy } } }; } async function createSymbolizerPackagePolicy({ client, soClient, packagePolicyClient, config }) { const packageName = 'profiler_symbolizer'; const { version } = await (0, _registry.fetchFindLatestPackageOrThrow)(packageName, { prerelease: true }); const packagePolicy = { policy_id: CLOUD_AGENT_POLICY_ID, enabled: true, package: { name: packageName, title: 'Universal Profiling Symbolizer', version }, name: SYMBOLIZER_PACKAGE_POLICY_NAME, namespace: 'default', inputs: [{ policy_template: 'universal_profiling_symbolizer', enabled: true, streams: [], type: 'pf-elastic-symbolizer', // doesnt have secret token vars: config !== null && config !== void 0 && config.symbolizer ? getVarsFor({ config: config.symbolizer, includeSecretToken: false }) : {} }] }; const esClient = client.getEsClient(); await packagePolicyClient.create(soClient, esClient, packagePolicy, { force: true }); } async function validateProfilingInApmPackagePolicy({ soClient, packagePolicyClient }) { try { var _apmPolicy$inputs$0$c, _apmPolicy$inputs$0$c2; const apmPolicy = await (0, _get_apm_policy.getApmPolicy)({ packagePolicyClient, soClient }); return { policies: { apm: { profilingEnabled: !!(apmPolicy && apmPolicy !== null && apmPolicy !== void 0 && (_apmPolicy$inputs$0$c = apmPolicy.inputs[0].config) !== null && _apmPolicy$inputs$0$c !== void 0 && (_apmPolicy$inputs$0$c2 = _apmPolicy$inputs$0$c['apm-server'].value) !== null && _apmPolicy$inputs$0$c2 !== void 0 && _apmPolicy$inputs$0$c2.profiling) } } }; } catch (e) { // In case apm integration is not available ignore the error and return as profiling is not enabled on the integration return { policies: { apm: { profilingEnabled: false } } }; } } async function removeProfilingFromApmPackagePolicy({ client, soClient, packagePolicyClient }) { const apmPackagePolicy = await (0, _get_apm_policy.getApmPolicy)({ packagePolicyClient, soClient }); if (!apmPackagePolicy) { throw new Error(`Could not find APM package policy`); } const esClient = client.getEsClient(); // remove profiling from apm-server config const newPackagePolicy = (0, _lodash.omit)(apmPackagePolicy, "inputs[0].config['apm-server'].value.profiling"); await packagePolicyClient.update(soClient, esClient, _get_apm_policy.ELASTIC_CLOUD_APM_POLICY, newPackagePolicy); }