From f58cd5c806b7a498e8bebb3086e58a61f75e7718 Mon Sep 17 00:00:00 2001
From: Thom Heymann <190132+thomheymann@users.noreply.github.com>
Date: Tue, 23 Nov 2021 15:15:31 +0000
Subject: [PATCH] Fix CLI formatting on windows (#119435)
* Provide more guidance on enrollment token
* Added suggestions from copy review
* Simplify copy
* format bash commands correctly
* Added suggestions from code review
---
.../public/cluster_configuration_form.tsx | 3 +-
.../public/enrollment_token_form.tsx | 3 +-
.../public/get_command_line_snippet.test.ts | 38 +++++++++++++++++++
.../public/get_command_line_snippet.ts | 12 ++++++
.../public/verification_code_form.tsx | 5 +--
5 files changed, 56 insertions(+), 5 deletions(-)
create mode 100644 src/plugins/interactive_setup/public/get_command_line_snippet.test.ts
create mode 100644 src/plugins/interactive_setup/public/get_command_line_snippet.ts
diff --git a/src/plugins/interactive_setup/public/cluster_configuration_form.tsx b/src/plugins/interactive_setup/public/cluster_configuration_form.tsx
index a366b5a279284..5888de763a44b 100644
--- a/src/plugins/interactive_setup/public/cluster_configuration_form.tsx
+++ b/src/plugins/interactive_setup/public/cluster_configuration_form.tsx
@@ -42,6 +42,7 @@ import { euiThemeVars } from '@kbn/ui-shared-deps-src/theme';
import type { Certificate } from '../common';
import { DocLink } from './doc_link';
+import { getCommandLineSnippet } from './get_command_line_snippet';
import { SubmitErrorCallout } from './submit_error_callout';
import { TextTruncate } from './text_truncate';
import type { ValidationErrors } from './use_form';
@@ -511,7 +512,7 @@ export const ForgotPasswordPopover: FunctionComponent
- bin/elasticsearch-reset-password --username {username}
+ {getCommandLineSnippet('elasticsearch-reset-password', `--username ${username}`)}
diff --git a/src/plugins/interactive_setup/public/enrollment_token_form.tsx b/src/plugins/interactive_setup/public/enrollment_token_form.tsx
index ef917b0c243fd..f283cf1307a97 100644
--- a/src/plugins/interactive_setup/public/enrollment_token_form.tsx
+++ b/src/plugins/interactive_setup/public/enrollment_token_form.tsx
@@ -30,6 +30,7 @@ import { FormattedMessage } from '@kbn/i18n/react';
import type { EnrollmentToken } from '../common';
import { DocLink } from './doc_link';
+import { getCommandLineSnippet } from './get_command_line_snippet';
import { SubmitErrorCallout } from './submit_error_callout';
import { TextTruncate } from './text_truncate';
import type { ValidationErrors } from './use_form';
@@ -260,7 +261,7 @@ export const EnrollmentTokenHelpPopover = () => {
/>
- bin/elasticsearch-create-enrollment-token --scope kibana
+ {getCommandLineSnippet('elasticsearch-create-enrollment-token', '--scope kibana')}
diff --git a/src/plugins/interactive_setup/public/get_command_line_snippet.test.ts b/src/plugins/interactive_setup/public/get_command_line_snippet.test.ts
new file mode 100644
index 0000000000000..0d53a1826be19
--- /dev/null
+++ b/src/plugins/interactive_setup/public/get_command_line_snippet.test.ts
@@ -0,0 +1,38 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { getCommandLineSnippet } from './get_command_line_snippet';
+
+describe('getCommandLineSnippet', () => {
+ const originalNavigator = window.navigator;
+
+ it('should format windows correctly', () => {
+ Object.defineProperty(window, 'navigator', {
+ value: { userAgent: 'Windows' },
+ writable: true,
+ });
+ expect(getCommandLineSnippet('kibana')).toEqual('bin\\kibana.bat');
+ expect(getCommandLineSnippet('kibana', '--silent')).toEqual('bin\\kibana.bat --silent');
+ });
+
+ it('should format unix correctly', () => {
+ Object.defineProperty(window, 'navigator', {
+ value: { userAgent: 'Linux' },
+ writable: true,
+ });
+ expect(getCommandLineSnippet('kibana')).toEqual('bin/kibana');
+ expect(getCommandLineSnippet('kibana', '--silent')).toEqual('bin/kibana --silent');
+ });
+
+ afterAll(function () {
+ Object.defineProperty(window, 'navigator', {
+ value: originalNavigator,
+ writable: true,
+ });
+ });
+});
diff --git a/src/plugins/interactive_setup/public/get_command_line_snippet.ts b/src/plugins/interactive_setup/public/get_command_line_snippet.ts
new file mode 100644
index 0000000000000..51af5b4929140
--- /dev/null
+++ b/src/plugins/interactive_setup/public/get_command_line_snippet.ts
@@ -0,0 +1,12 @@
+/*
+ * 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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+export function getCommandLineSnippet(command: string, args?: string) {
+ const isWindows = window.navigator.userAgent.includes('Win');
+ return `${isWindows ? `bin\\${command}.bat` : `bin/${command}`}${args ? ` ${args}` : ''}`;
+}
diff --git a/src/plugins/interactive_setup/public/verification_code_form.tsx b/src/plugins/interactive_setup/public/verification_code_form.tsx
index 9ff86c63aca7f..d95a840fa7eb1 100644
--- a/src/plugins/interactive_setup/public/verification_code_form.tsx
+++ b/src/plugins/interactive_setup/public/verification_code_form.tsx
@@ -23,6 +23,7 @@ import { FormattedMessage } from '@kbn/i18n/react';
import type { IHttpFetchError, ResponseErrorBody } from 'kibana/public';
import { VERIFICATION_CODE_LENGTH } from '../common';
+import { getCommandLineSnippet } from './get_command_line_snippet';
import { SingleCharsField } from './single_chars_field';
import { SubmitErrorCallout } from './submit_error_callout';
import type { ValidationErrors } from './use_form';
@@ -118,9 +119,7 @@ export const VerificationCodeForm: FunctionComponent
values={{
command: (
- {window.navigator.userAgent.includes('Win')
- ? 'bin\\kibana-verification-code.bat'
- : 'bin/kibana-verification-code'}
+ {getCommandLineSnippet('kibana-verification-code')}
),
}}