From f5b65233598f810d36d63a57b71e9451ca332cf4 Mon Sep 17 00:00:00 2001 From: Martin Angers Date: Tue, 4 Oct 2022 08:40:40 -0400 Subject: [PATCH] Hide overrides key if empty, display comment for flags if empty (#7986) --- .../AppSettingsPage/cards/Agents/Agents.tsx | 4 +-- .../AgentOptionsPage/AgentOptionsPage.tsx | 4 +-- frontend/utilities/helpers.ts | 33 ------------------- frontend/utilities/yaml/index.ts | 31 ++++++++++++++++- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/frontend/pages/admin/AppSettingsPage/cards/Agents/Agents.tsx b/frontend/pages/admin/AppSettingsPage/cards/Agents/Agents.tsx index 1ade9cae18..97eb037f41 100644 --- a/frontend/pages/admin/AppSettingsPage/cards/Agents/Agents.tsx +++ b/frontend/pages/admin/AppSettingsPage/cards/Agents/Agents.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from "react"; // @ts-ignore -import constructErrorString from "utilities/yaml"; +import { constructErrorString, agentOptionsToYaml } from "utilities/yaml"; import yaml from "js-yaml"; import paths from "router/paths"; @@ -26,7 +26,7 @@ const Agents = ({ const { ADMIN_TEAMS } = paths; const [formData, setFormData] = useState({ - agentOptions: yaml.dump(appConfig.agent_options) || {}, + agentOptions: agentOptionsToYaml(appConfig.agent_options), }); const { agentOptions } = formData; diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx b/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx index 2707d4a25b..d2a95e706f 100644 --- a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx +++ b/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx @@ -1,7 +1,7 @@ import React, { useContext, useState } from "react"; import { useQuery } from "react-query"; import { useErrorHandler } from "react-error-boundary"; -import yaml from "js-yaml"; +import { agentOptionsToYaml } from "utilities/yaml"; import { NotificationContext } from "context/notification"; import { IApiError } from "interfaces/errors"; @@ -45,7 +45,7 @@ const AgentOptionsPage = ({ if (selected) { setFormData({ - osquery_options: yaml.dump(selected.agent_options), + osquery_options: agentOptionsToYaml(selected.agent_options), }); setTeamName(selected.name); } else { diff --git a/frontend/utilities/helpers.ts b/frontend/utilities/helpers.ts index fc974d2b01..953b303f24 100644 --- a/frontend/utilities/helpers.ts +++ b/frontend/utilities/helpers.ts @@ -199,38 +199,6 @@ export const formatConfigDataForServer = (config: any): any => { }; }; -// TODO: Finalize interface for config - see frontend\interfaces\config.ts -export const frontendFormattedConfig = (config: IConfig) => { - const { - org_info: orgInfo, - server_settings: serverSettings, - smtp_settings: smtpSettings, - sso_settings: ssoSettings, - host_expiry_settings: hostExpirySettings, - webhook_settings: { host_status_webhook: webhookSettings }, // unnested to frontend - update_interval: updateInterval, - license, - logging, - } = config; - - if (config.agent_options) { - config.agent_options = yaml.dump(config.agent_options); - } - - return { - ...orgInfo, - ...serverSettings, - ...smtpSettings, - ...ssoSettings, - ...hostExpirySettings, - ...webhookSettings, - ...updateInterval, - ...license, - ...logging, - agent_options: config.agent_options, - }; -}; - export const formatFloatAsPercentage = (float: number): string => { const formatter = Intl.NumberFormat("en-US", { maximumSignificantDigits: 2, @@ -844,7 +812,6 @@ export default { secondsToDhms, labelSlug, setupData, - frontendFormattedConfig, syntaxHighlight, getValidatedTeamId, normalizeEmptyValues, diff --git a/frontend/utilities/yaml/index.ts b/frontend/utilities/yaml/index.ts index b493b792c1..77c8cdb1dd 100644 --- a/frontend/utilities/yaml/index.ts +++ b/frontend/utilities/yaml/index.ts @@ -1,11 +1,40 @@ +import yaml from "js-yaml"; + interface IYAMLError { name: string; reason: string; line: string; } -const constructErrorString = (yamlError: IYAMLError) => { +export const constructErrorString = (yamlError: IYAMLError) => { return `${yamlError.name}: ${yamlError.reason} at line ${yamlError.line}`; }; +export const agentOptionsToYaml = (agentOpts: any) => { + agentOpts ||= {}; + + // hide the "overrides" key if it is empty + if (!agentOpts.overrides || Object.keys(agentOpts.overrides).length === 0) { + delete agentOpts.overrides; + } + + // add a comment besides the "command_line_flags" if it is empty + let addFlagsComment = false; + if ( + !agentOpts.command_line_flags || + Object.keys(agentOpts.command_line_flags).length === 0 + ) { + // delete it so it does not render, and will add it explicitly after (along with the comment) + delete agentOpts.command_line_flags; + addFlagsComment = true; + } + + let yamlString = yaml.dump(agentOpts); + if (addFlagsComment) { + yamlString += "command_line_flags: {} # requires Orbit\n"; + } + + return yamlString; +}; + export default constructErrorString;