From 3d89a425cd95f786bf39e93285f7c800af4a3a83 Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 20:42:51 -0700 Subject: [PATCH 01/51] [MDS] Support Vega Visualizations (#5975) (#6212) (#6221) * Add MDS support for Vega * Refactor field to data_source_id * Add to CHANGELOG.md * Added test cases and renamed field to use data_source_name * Add prefix datasource name test case and add example in default hjson * Move CHANGELOG to appropriate section * Increased test coverage of search() method --------- (cherry picked from commit 1c5ad6c79e3a51472992ba3a537331a12c25e8ad) # Conflicts: # CHANGELOG.md (cherry picked from commit 05ede47a10f14bafe00e0502c78da5183bf59684) Signed-off-by: github-actions[bot] Co-authored-by: github-actions[bot] --- .../vis_type_vega/opensearch_dashboards.json | 2 +- .../data_model/opensearch_query_parser.ts | 2 +- .../public/data_model/search_api.test.ts | 159 ++++++++++++++++++ .../public/data_model/search_api.ts | 88 +++++++--- .../vis_type_vega/public/data_model/types.ts | 1 + .../vis_type_vega/public/default.spec.hjson | 4 + src/plugins/vis_type_vega/public/plugin.ts | 15 +- src/plugins/vis_type_vega/public/services.ts | 13 +- .../public/vega_request_handler.ts | 9 +- 9 files changed, 268 insertions(+), 25 deletions(-) create mode 100644 src/plugins/vis_type_vega/public/data_model/search_api.test.ts diff --git a/src/plugins/vis_type_vega/opensearch_dashboards.json b/src/plugins/vis_type_vega/opensearch_dashboards.json index faf10c831e6e..6cff356125bb 100644 --- a/src/plugins/vis_type_vega/opensearch_dashboards.json +++ b/src/plugins/vis_type_vega/opensearch_dashboards.json @@ -11,7 +11,7 @@ "inspector", "uiActions" ], - "optionalPlugins": ["home", "usageCollection"], + "optionalPlugins": ["home", "usageCollection", "dataSource"], "requiredBundles": [ "opensearchDashboardsUtils", "opensearchDashboardsReact", diff --git a/src/plugins/vis_type_vega/public/data_model/opensearch_query_parser.ts b/src/plugins/vis_type_vega/public/data_model/opensearch_query_parser.ts index f5da7e7b81d2..8f5594863903 100644 --- a/src/plugins/vis_type_vega/public/data_model/opensearch_query_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/opensearch_query_parser.ts @@ -229,7 +229,7 @@ export class OpenSearchQueryParser { name: getRequestName(r, index), })); - const data$ = this._searchAPI.search(opensearchSearches); + const data$ = await this._searchAPI.search(opensearchSearches); const results = await data$.toPromise(); diff --git a/src/plugins/vis_type_vega/public/data_model/search_api.test.ts b/src/plugins/vis_type_vega/public/data_model/search_api.test.ts new file mode 100644 index 000000000000..7e756e7bdec1 --- /dev/null +++ b/src/plugins/vis_type_vega/public/data_model/search_api.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { SavedObjectsClientContract, SavedObjectsFindOptions } from 'opensearch-dashboards/public'; +import { SearchAPI, SearchAPIDependencies } from './search_api'; +import { ISearchStart } from 'src/plugins/data/public'; +import { IUiSettingsClient } from 'opensearch-dashboards/public'; + +jest.mock('rxjs', () => ({ + combineLatest: jest.fn().mockImplementation((obj) => obj), +})); + +jest.mock('../../../data/public', () => ({ + getSearchParamsFromRequest: jest.fn().mockImplementation((obj, _) => obj), +})); + +interface MockSearch { + params?: Record; + dataSourceId?: string; + pipe: () => {}; +} + +describe('SearchAPI.search', () => { + // This will only test that searchApiParams were correctly set. As such, every other function can be mocked + const getSearchAPI = (dataSourceEnabled: boolean) => { + const savedObjectsClient = {} as SavedObjectsClientContract; + + const searchStartMock = {} as ISearchStart; + searchStartMock.search = jest.fn().mockImplementation((obj, _) => { + const mockedSearchResults = {} as MockSearch; + mockedSearchResults.params = obj; + mockedSearchResults.pipe = jest.fn().mockReturnValue(mockedSearchResults.params); + return mockedSearchResults; + }); + + const uiSettings = {} as IUiSettingsClient; + uiSettings.get = jest.fn().mockReturnValue(0); + uiSettings.get.bind = jest.fn().mockReturnValue(0); + + const dependencies = { + savedObjectsClient, + dataSourceEnabled, + search: searchStartMock, + uiSettings, + } as SearchAPIDependencies; + const searchAPI = new SearchAPI(dependencies); + searchAPI.findDataSourceIdbyName = jest.fn().mockImplementation((name) => { + if (!dataSourceEnabled) { + throw new Error(); + } + if (name === 'exampleName') { + return Promise.resolve('some-id'); + } + }); + + return searchAPI; + }; + + test('If MDS is disabled and there is no datasource, return params without datasource id', async () => { + const searchAPI = getSearchAPI(false); + const requests = [{ name: 'example-id' }]; + const fetchParams = ((await searchAPI.search(requests)) as unknown) as MockSearch[]; + expect(fetchParams[0].params).toBe(requests[0]); + expect(fetchParams[0].hasOwnProperty('dataSourceId')).toBe(false); + }); + + test('If MDS is disabled and there is a datasource, it should throw an errorr', () => { + const searchAPI = getSearchAPI(false); + const requests = [{ name: 'example-id', data_source_name: 'non-existent-datasource' }]; + expect(searchAPI.search(requests)).rejects.toThrowError(); + }); + + test('If MDS is enabled and there is no datasource, return params without datasource id', async () => { + const searchAPI = getSearchAPI(true); + const requests = [{ name: 'example-id' }]; + const fetchParams = ((await searchAPI.search(requests)) as unknown) as MockSearch[]; + expect(fetchParams[0].params).toBe(requests[0]); + expect(fetchParams[0].hasOwnProperty('dataSourceId')).toBe(false); + }); + + test('If MDS is enabled and there is a datasource, return params with datasource id', async () => { + const searchAPI = getSearchAPI(true); + const requests = [{ name: 'example-id', data_source_name: 'exampleName' }]; + const fetchParams = ((await searchAPI.search(requests)) as unknown) as MockSearch[]; + expect(fetchParams[0].hasOwnProperty('params')).toBe(true); + expect(fetchParams[0].dataSourceId).toBe('some-id'); + }); +}); + +describe('SearchAPI.findDataSourceIdbyName', () => { + const savedObjectsClient = {} as SavedObjectsClientContract; + savedObjectsClient.find = jest.fn().mockImplementation((query: SavedObjectsFindOptions) => { + if (query.search === `"uniqueDataSource"`) { + return Promise.resolve({ + total: 1, + savedObjects: [{ id: 'some-datasource-id', attributes: { title: 'uniqueDataSource' } }], + }); + } else if (query.search === `"duplicateDataSource"`) { + return Promise.resolve({ + total: 2, + savedObjects: [ + { id: 'some-datasource-id', attributes: { title: 'duplicateDataSource' } }, + { id: 'some-other-datasource-id', attributes: { title: 'duplicateDataSource' } }, + ], + }); + } else if (query.search === `"DataSource"`) { + return Promise.resolve({ + total: 2, + savedObjects: [ + { id: 'some-datasource-id', attributes: { title: 'DataSource' } }, + { id: 'some-other-datasource-id', attributes: { title: 'DataSource Copy' } }, + ], + }); + } else { + return Promise.resolve({ + total: 0, + savedObjects: [], + }); + } + }); + + const getSearchAPI = (dataSourceEnabled: boolean) => { + const dependencies = { savedObjectsClient, dataSourceEnabled } as SearchAPIDependencies; + return new SearchAPI(dependencies); + }; + + test('If dataSource is disabled, throw error', () => { + const searchAPI = getSearchAPI(false); + expect(searchAPI.findDataSourceIdbyName('nonexistentDataSource')).rejects.toThrowError( + 'data_source_name cannot be used because data_source.enabled is false' + ); + }); + + test('If dataSource is enabled but no matching dataSourceName, then throw error', () => { + const searchAPI = getSearchAPI(true); + expect(searchAPI.findDataSourceIdbyName('nonexistentDataSource')).rejects.toThrowError( + 'Expected exactly 1 result for data_source_name "nonexistentDataSource" but got 0 results' + ); + }); + + test('If dataSource is enabled but multiple dataSourceNames, then throw error', () => { + const searchAPI = getSearchAPI(true); + expect(searchAPI.findDataSourceIdbyName('duplicateDataSource')).rejects.toThrowError( + 'Expected exactly 1 result for data_source_name "duplicateDataSource" but got 2 results' + ); + }); + + test('If dataSource is enabled but only one dataSourceName, then return id', async () => { + const searchAPI = getSearchAPI(true); + expect(await searchAPI.findDataSourceIdbyName('uniqueDataSource')).toBe('some-datasource-id'); + }); + + test('If dataSource is enabled and the dataSourceName is a prefix of another, ensure the prefix is only returned', async () => { + const searchAPI = getSearchAPI(true); + expect(await searchAPI.findDataSourceIdbyName('DataSource')).toBe('some-datasource-id'); + }); +}); diff --git a/src/plugins/vis_type_vega/public/data_model/search_api.ts b/src/plugins/vis_type_vega/public/data_model/search_api.ts index 7f3a333f84d2..2c0b7cdd614e 100644 --- a/src/plugins/vis_type_vega/public/data_model/search_api.ts +++ b/src/plugins/vis_type_vega/public/data_model/search_api.ts @@ -31,6 +31,8 @@ import { combineLatest } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { CoreStart, IUiSettingsClient } from 'opensearch-dashboards/public'; +import { SavedObjectsClientContract } from 'src/core/public'; +import { DataSourceAttributes } from 'src/plugins/data_source/common/data_sources'; import { getSearchParamsFromRequest, SearchRequest, @@ -45,6 +47,8 @@ export interface SearchAPIDependencies { uiSettings: IUiSettingsClient; injectedMetadata: CoreStart['injectedMetadata']; search: DataPublicPluginStart['search']; + dataSourceEnabled: boolean; + savedObjectsClient: SavedObjectsClientContract; } export class SearchAPI { @@ -54,31 +58,75 @@ export class SearchAPI { public readonly inspectorAdapters?: VegaInspectorAdapters ) {} - search(searchRequests: SearchRequest[]) { + async search(searchRequests: SearchRequest[]) { const { search } = this.dependencies.search; const requestResponders: any = {}; return combineLatest( - searchRequests.map((request) => { - const requestId = request.name; - const params = getSearchParamsFromRequest(request, { - getConfig: this.dependencies.uiSettings.get.bind(this.dependencies.uiSettings), - }); - - if (this.inspectorAdapters) { - requestResponders[requestId] = this.inspectorAdapters.requests.start(requestId, request); - requestResponders[requestId].json(params.body); - } - - return search({ params }, { abortSignal: this.abortSignal }).pipe( - tap((data) => this.inspectSearchResult(data, requestResponders[requestId])), - map((data) => ({ - name: requestId, - rawResponse: data.rawResponse, - })) - ); - }) + await Promise.all( + searchRequests.map(async (request) => { + const requestId = request.name; + const dataSourceId = !!request.data_source_name + ? await this.findDataSourceIdbyName(request.data_source_name) + : undefined; + + const params = getSearchParamsFromRequest(request, { + getConfig: this.dependencies.uiSettings.get.bind(this.dependencies.uiSettings), + }); + + if (this.inspectorAdapters) { + requestResponders[requestId] = this.inspectorAdapters.requests.start( + requestId, + request + ); + requestResponders[requestId].json(params.body); + } + + const searchApiParams = + dataSourceId && this.dependencies.dataSourceEnabled + ? { params, dataSourceId } + : { params }; + + return search(searchApiParams, { abortSignal: this.abortSignal }).pipe( + tap((data) => this.inspectSearchResult(data, requestResponders[requestId])), + map((data) => ({ + name: requestId, + rawResponse: data.rawResponse, + })) + ); + }) + ) + ); + } + + async findDataSourceIdbyName(dataSourceName: string) { + if (!this.dependencies.dataSourceEnabled) { + throw new Error('data_source_name cannot be used because data_source.enabled is false'); + } + const dataSources = await this.dataSourceFindQuery(dataSourceName); + + // In the case that data_source_name is a prefix of another name, match exact data_source_name + const possibleDataSourceIds = dataSources.savedObjects.filter( + (obj) => obj.attributes.title === dataSourceName ); + + if (possibleDataSourceIds.length !== 1) { + throw new Error( + `Expected exactly 1 result for data_source_name "${dataSourceName}" but got ${possibleDataSourceIds.length} results` + ); + } + + return possibleDataSourceIds.pop()?.id; + } + + async dataSourceFindQuery(dataSourceName: string) { + return await this.dependencies.savedObjectsClient.find({ + type: 'data-source', + perPage: 10, + search: `"${dataSourceName}"`, + searchFields: ['title'], + fields: ['id', 'title'], + }); } public resetSearchStats() { diff --git a/src/plugins/vis_type_vega/public/data_model/types.ts b/src/plugins/vis_type_vega/public/data_model/types.ts index 35198f846f02..4d0b2bb476d4 100644 --- a/src/plugins/vis_type_vega/public/data_model/types.ts +++ b/src/plugins/vis_type_vega/public/data_model/types.ts @@ -186,6 +186,7 @@ export interface UrlObject { [CONSTANTS.TYPE]?: string; name?: string; index?: string; + data_source_name?: string; body?: Body; size?: number; timeout?: string; diff --git a/src/plugins/vis_type_vega/public/default.spec.hjson b/src/plugins/vis_type_vega/public/default.spec.hjson index b4e126bfa3d3..457a6398b9d5 100644 --- a/src/plugins/vis_type_vega/public/default.spec.hjson +++ b/src/plugins/vis_type_vega/public/default.spec.hjson @@ -29,6 +29,10 @@ // Which index to search index: _all + + // If "data_source.enabled: true", optionally set the data source name to query from (omit field if querying from local cluster) + // data_source_name: Example US Cluster + // Aggregate data by the time field into time buckets, counting the number of documents in each bucket. body: { aggs: { diff --git a/src/plugins/vis_type_vega/public/plugin.ts b/src/plugins/vis_type_vega/public/plugin.ts index 3967c5351367..924cc36739ad 100644 --- a/src/plugins/vis_type_vega/public/plugin.ts +++ b/src/plugins/vis_type_vega/public/plugin.ts @@ -28,6 +28,7 @@ * under the License. */ +import { DataSourcePluginSetup } from 'src/plugins/data_source/public'; import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; import { DataPublicPluginSetup, DataPublicPluginStart } from '../../data/public'; @@ -41,6 +42,8 @@ import { setUISettings, setMapsLegacyConfig, setInjectedMetadata, + setDataSourceEnabled, + setSavedObjectsClient, } from './services'; import { createVegaFn } from './expressions/vega_fn'; @@ -69,6 +72,7 @@ export interface VegaPluginSetupDependencies { visualizations: VisualizationsSetup; inspector: InspectorSetup; data: DataPublicPluginSetup; + dataSource?: DataSourcePluginSetup; mapsLegacy: any; } @@ -88,7 +92,14 @@ export class VegaPlugin implements Plugin, void> { public async setup( core: CoreSetup, - { inspector, data, expressions, visualizations, mapsLegacy }: VegaPluginSetupDependencies + { + inspector, + data, + expressions, + visualizations, + mapsLegacy, + dataSource, + }: VegaPluginSetupDependencies ) { setInjectedVars({ enableExternalUrls: this.initializerContext.config.get().enableExternalUrls, @@ -96,6 +107,7 @@ export class VegaPlugin implements Plugin, void> { }); setUISettings(core.uiSettings); setMapsLegacyConfig(mapsLegacy.config); + setDataSourceEnabled({ enabled: !!dataSource }); const visualizationDependencies: Readonly = { core, @@ -116,6 +128,7 @@ export class VegaPlugin implements Plugin, void> { public start(core: CoreStart, { data, uiActions }: VegaPluginStartDependencies) { setNotifications(core.notifications); setData(data); + setSavedObjectsClient(core.savedObjects); setUiActions(uiActions); setInjectedMetadata(core.injectedMetadata); } diff --git a/src/plugins/vis_type_vega/public/services.ts b/src/plugins/vis_type_vega/public/services.ts index b67a0959c63d..36a417b30389 100644 --- a/src/plugins/vis_type_vega/public/services.ts +++ b/src/plugins/vis_type_vega/public/services.ts @@ -28,7 +28,12 @@ * under the License. */ -import { CoreStart, NotificationsStart, IUiSettingsClient } from 'src/core/public'; +import { + CoreStart, + NotificationsStart, + IUiSettingsClient, + SavedObjectsStart, +} from 'src/core/public'; import { DataPublicPluginStart } from '../../data/public'; import { createGetterSetter } from '../../opensearch_dashboards_utils/public'; @@ -36,6 +41,12 @@ import { MapsLegacyConfig } from '../../maps_legacy/config'; import { UiActionsStart } from '../../ui_actions/public'; export const [getData, setData] = createGetterSetter('Data'); +export const [getDataSourceEnabled, setDataSourceEnabled] = createGetterSetter<{ + enabled: boolean; +}>('DataSource'); +export const [getSavedObjectsClient, setSavedObjectsClient] = createGetterSetter( + 'SavedObjects' +); export const [getNotifications, setNotifications] = createGetterSetter( 'Notifications' diff --git a/src/plugins/vis_type_vega/public/vega_request_handler.ts b/src/plugins/vis_type_vega/public/vega_request_handler.ts index 7711f5d0f497..0d5556a3e2fc 100644 --- a/src/plugins/vis_type_vega/public/vega_request_handler.ts +++ b/src/plugins/vis_type_vega/public/vega_request_handler.ts @@ -35,7 +35,12 @@ import { TimeCache } from './data_model/time_cache'; import { VegaVisualizationDependencies } from './plugin'; import { VisParams } from './expressions/vega_fn'; -import { getData, getInjectedMetadata } from './services'; +import { + getData, + getDataSourceEnabled, + getInjectedMetadata, + getSavedObjectsClient, +} from './services'; import { VegaInspectorAdapters } from './vega_inspector'; interface VegaRequestHandlerParams { @@ -70,6 +75,8 @@ export function createVegaRequestHandler( uiSettings, search: getData().search, injectedMetadata: getInjectedMetadata(), + dataSourceEnabled: getDataSourceEnabled().enabled, + savedObjectsClient: getSavedObjectsClient().client, }, context.abortSignal, context.inspectorAdapters From 4086a8dafab03260085e12b27cd167897aff60ee Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 20:43:36 -0700 Subject: [PATCH 02/51] [MDS] Add Vega support for importing saved objects (#6123) (#6214) (#6222) * Add MDS support for Vega * Refactor field to data_source_id * Add to CHANGELOG.md * Added test cases and renamed field to use data_source_name * Add prefix datasource name test case and add example in default hjson * Move CHANGELOG to appropriate section * Increased test coverage of search() method * Add test cases for util function * Add util function to modify Vega Spec * Add method to verify Vega saved object type * Add import saved object support for Vega * Add unit tests for Vega objects in create and conflict modes * Refactored utils test file * Add to CHANGELOG * Use bulkget instead of single get * Add datasource references to the specs * Fix bootstrap errors * Add edge case where title is potentially undefined * Address PR comments * Add more test coverage for checking conflict * Fix unit test --------- (cherry picked from commit de978d4516a715eedf56b4abaa16a7aa11a2a654) # Conflicts: # CHANGELOG.md (cherry picked from commit d14463759f908231cf1dc932d8fdb89a893a82d6) Signed-off-by: github-actions[bot] Co-authored-by: github-actions[bot] Co-authored-by: Ashwin P Chandran --- .../check_conflict_for_data_source.test.ts | 161 +++++++++++- .../import/check_conflict_for_data_source.ts | 47 +++- .../import/create_saved_objects.test.ts | 116 +++++++- .../import/create_saved_objects.ts | 162 +++++++----- .../import/import_saved_objects.test.ts | 1 + .../import/import_saved_objects.ts | 1 + .../vega_spec_with_multiple_urls.hjson | 147 +++++++++++ .../vega_spec_with_multiple_urls.json | 95 +++++++ .../vega_spec_with_multiple_urls_mds.hjson | 148 +++++++++++ .../vega_spec_with_multiple_urls_mds.json | 96 +++++++ .../vega_spec_with_opensearch_query.hjson | 61 +++++ .../vega_spec_with_opensearch_query.json | 36 +++ .../vega_spec_without_opensearch_query.hjson | 117 +++++++++ .../vega_spec_without_opensearch_query.json | 66 +++++ .../server/saved_objects/import/utils.test.ts | 247 ++++++++++++++++++ src/core/server/saved_objects/import/utils.ts | 103 ++++++++ src/plugins/vis_type_vega/server/plugin.ts | 16 +- src/plugins/vis_type_vega/server/services.ts | 10 + .../vega_outdated_references_mds.hjson | 223 ++++++++++++++++ .../vega_spec_up_to_date_urls_mds.hjson | 185 +++++++++++++ .../vega_spec_with_multiple_urls.hjson | 165 ++++++++++++ .../vega_spec_with_multiple_urls.json | 110 ++++++++ .../vega_spec_with_multiple_urls_mds.hjson | 185 +++++++++++++ .../vega_spec_with_multiple_urls_mds.json | 127 +++++++++ .../vega_spec_with_opensearch_query.hjson | 61 +++++ .../vega_spec_with_opensearch_query.json | 36 +++ .../vega_spec_with_opensearch_query_mds.hjson | 62 +++++ .../vega_spec_with_opensearch_query_mds.json | 37 +++ .../vega_spec_without_opensearch_query.hjson | 117 +++++++++ .../vega_spec_without_opensearch_query.json | 66 +++++ src/plugins/vis_type_vega/server/types.ts | 2 + .../vis_type_vega/server/utils.test.ts | 181 +++++++++++++ src/plugins/vis_type_vega/server/utils.ts | 98 +++++++ .../vega_visualization_client_wrapper.test.ts | 243 +++++++++++++++++ .../vega_visualization_client_wrapper.ts | 110 ++++++++ 35 files changed, 3567 insertions(+), 71 deletions(-) create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.hjson create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.json create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.hjson create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.json create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.hjson create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.json create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.hjson create mode 100644 src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.json create mode 100644 src/core/server/saved_objects/import/utils.test.ts create mode 100644 src/core/server/saved_objects/import/utils.ts create mode 100644 src/plugins/vis_type_vega/server/services.ts create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_outdated_references_mds.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_up_to_date_urls_mds.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.json create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.json create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.json create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.json create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.hjson create mode 100644 src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.json create mode 100644 src/plugins/vis_type_vega/server/utils.test.ts create mode 100644 src/plugins/vis_type_vega/server/utils.ts create mode 100644 src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.test.ts create mode 100644 src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.ts diff --git a/src/core/server/saved_objects/import/check_conflict_for_data_source.test.ts b/src/core/server/saved_objects/import/check_conflict_for_data_source.test.ts index 2b50ba8e9b35..b2a6ae6fda65 100644 --- a/src/core/server/saved_objects/import/check_conflict_for_data_source.test.ts +++ b/src/core/server/saved_objects/import/check_conflict_for_data_source.test.ts @@ -5,7 +5,7 @@ import { mockUuidv4 } from './__mocks__'; import { SavedObjectReference, SavedObjectsImportRetry } from 'opensearch-dashboards/public'; -import { SavedObject } from '../types'; +import { SavedObject, SavedObjectsClientContract } from '../types'; import { SavedObjectsErrorHelpers } from '..'; import { checkConflictsForDataSource, @@ -24,6 +24,45 @@ const createObject = (type: string, id: string): SavedObjectType => ({ references: (Symbol() as unknown) as SavedObjectReference[], }); +const createVegaVisualizationObject = (id: string): SavedObjectType => { + const visState = + id.split('_').length > 1 + ? '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: old-datasource-title\\n }\\n }\\n}"}}' + : '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n }\\n }\\n}"}}'; + return { + type: 'visualization', + id, + attributes: { title: 'some-title', visState }, + references: + id.split('_').length > 1 + ? [{ id: id.split('_')[0], type: 'data-source', name: 'dataSource' }] + : [], + } as SavedObjectType; +}; + +const getSavedObjectClient = (): SavedObjectsClientContract => { + const savedObject = {} as SavedObjectsClientContract; + savedObject.get = jest.fn().mockImplementation((type, id) => { + if (type === 'data-source' && id === 'old-datasource-id') { + return Promise.resolve({ + attributes: { + title: 'old-datasource-title', + }, + }); + } else if (type === 'data-source') { + return Promise.resolve({ + attributes: { + title: 'some-datasource-title', + }, + }); + } + + return Promise.resolve(undefined); + }); + + return savedObject; +}; + const getResultMock = { conflict: (type: string, id: string) => { const error = SavedObjectsErrorHelpers.createConflictError(type, id).output.payload; @@ -56,6 +95,7 @@ describe('#checkConflictsForDataSource', () => { retries?: SavedObjectsImportRetry[]; createNewCopies?: boolean; dataSourceId?: string; + savedObjectsClient?: SavedObjectsClientContract; }): ConflictsForDataSourceParams => { return { ...partial }; }; @@ -140,4 +180,123 @@ describe('#checkConflictsForDataSource', () => { importIdMap: new Map(), }); }); + + /* + Vega test cases + */ + it('will attach datasource name to Vega spec when importing from local to datasource', async () => { + const vegaSavedObject = createVegaVisualizationObject('some-object-id'); + const params = setupParams({ + objects: [vegaSavedObject], + ignoreRegularConflicts: true, + dataSourceId: 'some-datasource-id', + savedObjectsClient: getSavedObjectClient(), + }); + const checkConflictsForDataSourceResult = await checkConflictsForDataSource(params); + + expect(params.savedObjectsClient?.get).toHaveBeenCalledWith( + 'data-source', + 'some-datasource-id' + ); + expect(checkConflictsForDataSourceResult).toEqual( + expect.objectContaining({ + filteredObjects: [ + { + ...vegaSavedObject, + attributes: { + title: 'some-title', + visState: + '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: some-datasource-title\\n }\\n }\\n}"}}', + }, + id: 'some-datasource-id_some-object-id', + references: [ + { + id: 'some-datasource-id', + type: 'data-source', + name: 'dataSource', + }, + ], + }, + ], + errors: [], + importIdMap: new Map([ + [ + `visualization:some-object-id`, + { id: 'some-datasource-id_some-object-id', omitOriginId: true }, + ], + ]), + }) + ); + }); + + it('will not change Vega spec when importing from datasource to different datasource', async () => { + const vegaSavedObject = createVegaVisualizationObject('old-datasource-id_some-object-id'); + const params = setupParams({ + objects: [vegaSavedObject], + ignoreRegularConflicts: true, + dataSourceId: 'some-datasource-id', + savedObjectsClient: getSavedObjectClient(), + }); + const checkConflictsForDataSourceResult = await checkConflictsForDataSource(params); + + expect(params.savedObjectsClient?.get).toHaveBeenCalledWith( + 'data-source', + 'some-datasource-id' + ); + expect(checkConflictsForDataSourceResult).toEqual( + expect.objectContaining({ + filteredObjects: [ + { + ...vegaSavedObject, + attributes: { + title: 'some-title', + visState: + '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: old-datasource-title\\n }\\n }\\n}"}}', + }, + id: 'some-datasource-id_some-object-id', + }, + ], + errors: [], + importIdMap: new Map([ + [ + `visualization:some-object-id`, + { id: 'some-datasource-id_some-object-id', omitOriginId: true }, + ], + ]), + }) + ); + }); + + it('will not change Vega spec when dataSourceTitle is undefined', async () => { + const vegaSavedObject = createVegaVisualizationObject('old-datasource-id_some-object-id'); + const params = setupParams({ + objects: [vegaSavedObject], + ignoreRegularConflicts: true, + dataSourceId: 'nonexistent-datasource-title-id', + savedObjectsClient: getSavedObjectClient(), + }); + const checkConflictsForDataSourceResult = await checkConflictsForDataSource(params); + + expect(params.savedObjectsClient?.get).toHaveBeenCalledWith( + 'data-source', + 'nonexistent-datasource-title-id' + ); + expect(checkConflictsForDataSourceResult).toEqual( + expect.objectContaining({ + filteredObjects: [ + { + ...vegaSavedObject, + id: 'nonexistent-datasource-title-id_some-object-id', + }, + ], + errors: [], + importIdMap: new Map([ + [ + `visualization:some-object-id`, + { id: 'nonexistent-datasource-title-id_some-object-id', omitOriginId: true }, + ], + ]), + }) + ); + }); }); diff --git a/src/core/server/saved_objects/import/check_conflict_for_data_source.ts b/src/core/server/saved_objects/import/check_conflict_for_data_source.ts index 6611b01dfb2a..a0400c57d023 100644 --- a/src/core/server/saved_objects/import/check_conflict_for_data_source.ts +++ b/src/core/server/saved_objects/import/check_conflict_for_data_source.ts @@ -3,13 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SavedObject, SavedObjectsImportError, SavedObjectsImportRetry } from '../types'; +import { + SavedObject, + SavedObjectsClientContract, + SavedObjectsImportError, + SavedObjectsImportRetry, +} from '../types'; +import { + extractVegaSpecFromSavedObject, + getDataSourceTitleFromId, + updateDataSourceNameInVegaSpec, +} from './utils'; export interface ConflictsForDataSourceParams { objects: Array>; ignoreRegularConflicts?: boolean; retries?: SavedObjectsImportRetry[]; dataSourceId?: string; + savedObjectsClient?: SavedObjectsClientContract; } interface ImportIdMapEntry { @@ -31,6 +42,7 @@ export async function checkConflictsForDataSource({ ignoreRegularConflicts, retries = [], dataSourceId, + savedObjectsClient, }: ConflictsForDataSourceParams) { const filteredObjects: Array> = []; const errors: SavedObjectsImportError[] = []; @@ -43,6 +55,12 @@ export async function checkConflictsForDataSource({ (acc, cur) => acc.set(`${cur.type}:${cur.id}`, cur), new Map() ); + + const dataSourceTitle = + !!dataSourceId && !!savedObjectsClient + ? await getDataSourceTitleFromId(dataSourceId, savedObjectsClient) + : undefined; + objects.forEach((object) => { const { type, @@ -74,6 +92,33 @@ export async function checkConflictsForDataSource({ /** * Only update importIdMap and filtered objects */ + + // Some visualization types will need special modifications, like Vega visualizations + if (object.type === 'visualization') { + const vegaSpec = extractVegaSpecFromSavedObject(object); + + if (!!vegaSpec && !!dataSourceTitle) { + const updatedVegaSpec = updateDataSourceNameInVegaSpec({ + spec: vegaSpec, + newDataSourceName: dataSourceTitle, + }); + + // @ts-expect-error + const visStateObject = JSON.parse(object.attributes?.visState); + visStateObject.params.spec = updatedVegaSpec; + + // @ts-expect-error + object.attributes.visState = JSON.stringify(visStateObject); + if (!!dataSourceId) { + object.references.push({ + id: dataSourceId, + name: 'dataSource', + type: 'data-source', + }); + } + } + } + const omitOriginId = ignoreRegularConflicts; importIdMap.set(`${type}:${id}`, { id: `${dataSourceId}_${rawId}`, omitOriginId }); filteredObjects.push({ ...object, id: `${dataSourceId}_${rawId}` }); diff --git a/src/core/server/saved_objects/import/create_saved_objects.test.ts b/src/core/server/saved_objects/import/create_saved_objects.test.ts index f1118842c967..1a9e218f169d 100644 --- a/src/core/server/saved_objects/import/create_saved_objects.test.ts +++ b/src/core/server/saved_objects/import/create_saved_objects.test.ts @@ -115,6 +115,37 @@ const visualizationObj = { }, }, }; + +const getVegaVisualizationObj = (id: string) => ({ + type: 'visualization', + id, + attributes: { + title: 'some-title', + visState: + '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n }\\n }\\n}"}}', + }, + references: [], + namespaces: ['default'], + version: 'some-version', + updated_at: 'some-date', +}); + +const getVegaMDSVisualizationObj = (id: string, dataSourceId: string) => ({ + type: 'visualization', + id: dataSourceId ? `${dataSourceId}_${id}` : id, + attributes: { + title: 'some-other-title', + visState: + '{"title":"some-other-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: old-datasource-title\\n }\\n }\\n}"}}', + }, + references: [ + { + id: dataSourceId, + name: 'dataSource', + type: 'data-source', + }, + ], +}); // non-multi-namespace types shouldn't have origin IDs, but we include test cases to ensure it's handled gracefully // non-multi-namespace types by definition cannot result in an unresolvable conflict, so we don't include test cases for those const importId3 = 'id-foo'; @@ -142,8 +173,11 @@ describe('#createSavedObjects', () => { overwrite?: boolean; dataSourceId?: string; dataSourceTitle?: string; + savedObjectsCustomClient?: jest.Mocked; }): CreateSavedObjectsParams => { - savedObjectsClient = savedObjectsClientMock.create(); + savedObjectsClient = !!partial.savedObjectsCustomClient + ? partial.savedObjectsCustomClient + : savedObjectsClientMock.create(); bulkCreate = savedObjectsClient.bulkCreate; return { accumulatedErrors: [], ...partial, savedObjectsClient, importIdMap }; }; @@ -490,6 +524,29 @@ describe('#createSavedObjects', () => { expect(results).toEqual(expectedResultsWithDataSource); }; + const testVegaVisualizationsWithDataSources = async (params: { + objects: SavedObject[]; + expectedFilteredObjects: Array>; + dataSourceId?: string; + dataSourceTitle?: string; + }) => { + const savedObjectsCustomClient = savedObjectsClientMock.create(); + + const options = setupParams({ + ...params, + savedObjectsCustomClient, + }); + savedObjectsCustomClient.bulkCreate = jest.fn().mockResolvedValue({ + saved_objects: params.objects.map((obj) => { + return getResultMock.success(obj, options); + }), + }); + + const results = await createSavedObjects(options); + + expect(results.createdObjects).toMatchObject(params.expectedFilteredObjects); + }; + describe('with an undefined namespace', () => { test('calls bulkCreate once with input objects', async () => { await testBulkCreateObjects(); @@ -546,4 +603,61 @@ describe('#createSavedObjects', () => { ); }); }); + + describe('with a data source for Vega saved objects', () => { + test('can attach a data source name to the Vega spec if there is a local query', async () => { + const objects = [getVegaVisualizationObj('some-vega-id')]; + const expectedObject = getVegaVisualizationObj('some-vega-id'); + const expectedFilteredObjects = [ + { + ...expectedObject, + attributes: { + title: 'some-title_dataSourceName', + visState: + '{"title":"some-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: dataSourceName\\n }\\n }\\n}"}}', + }, + id: 'some-vega-id', + references: [ + { + id: 'some-datasource-id', + type: 'data-source', + name: 'dataSource', + }, + ], + }, + ]; + await testVegaVisualizationsWithDataSources({ + objects, + expectedFilteredObjects, + dataSourceId: 'some-datasource-id', + dataSourceTitle: 'dataSourceName', + }); + }); + + test('will not update the data source name in the Vega spec if no local cluster queries', async () => { + const objects = [getVegaMDSVisualizationObj('some-vega-id', 'old-datasource-id')]; + const expectedObject = getVegaMDSVisualizationObj('some-vega-id', 'old-datasource-id'); + expectedObject.references.push({ + id: 'some-datasource-id', + name: 'dataSource', + type: 'data-source', + }); + const expectedFilteredObjects = [ + { + ...expectedObject, + attributes: { + title: 'some-other-title_dataSourceName', + visState: + '{"title":"some-other-title","type":"vega","aggs":[],"params":{"spec":"{\\n data: {\\n url: {\\n index: example_index\\n data_source_name: old-datasource-title\\n }\\n }\\n}"}}', + }, + }, + ]; + await testVegaVisualizationsWithDataSources({ + objects, + expectedFilteredObjects, + dataSourceId: 'some-datasource-id', + dataSourceTitle: 'dataSourceName', + }); + }); + }); }); diff --git a/src/core/server/saved_objects/import/create_saved_objects.ts b/src/core/server/saved_objects/import/create_saved_objects.ts index 6fd08520281e..eab33d6c19b3 100644 --- a/src/core/server/saved_objects/import/create_saved_objects.ts +++ b/src/core/server/saved_objects/import/create_saved_objects.ts @@ -31,6 +31,7 @@ import { SavedObject, SavedObjectsClientContract, SavedObjectsImportError } from '../types'; import { extractErrors } from './extract_errors'; import { CreatedObject } from './types'; +import { extractVegaSpecFromSavedObject, updateDataSourceNameInVegaSpec } from './utils'; interface CreateSavedObjectsParams { objects: Array>; @@ -80,89 +81,116 @@ export const createSavedObjects = async ({ ); // filter out the 'version' field of each object, if it exists - - const objectsToCreate = filteredObjects.map(({ version, ...object }) => { - if (dataSourceId) { - // @ts-expect-error - if (dataSourceTitle && object.attributes.title) { - if ( - object.type === 'dashboard' || - object.type === 'visualization' || - object.type === 'search' - ) { - // @ts-expect-error - object.attributes.title = object.attributes.title + `_${dataSourceTitle}`; + const objectsToCreate = await Promise.all( + filteredObjects.map(({ version, ...object }) => { + if (dataSourceId) { + // @ts-expect-error + if (dataSourceTitle && object.attributes.title) { + if ( + object.type === 'dashboard' || + object.type === 'visualization' || + object.type === 'search' + ) { + // @ts-expect-error + object.attributes.title = object.attributes.title + `_${dataSourceTitle}`; + } } - } - if (object.type === 'index-pattern') { - object.references = [ - { - id: `${dataSourceId}`, - type: 'data-source', - name: 'dataSource', - }, - ]; - } + // Some visualization types will need special modifications, like Vega visualizations + if (object.type === 'visualization') { + const vegaSpec = extractVegaSpecFromSavedObject(object); - if (object.type === 'visualization' || object.type === 'search') { - // @ts-expect-error - const searchSourceString = object.attributes?.kibanaSavedObjectMeta?.searchSourceJSON; - // @ts-expect-error - const visStateString = object.attributes?.visState; + if (!!vegaSpec && !!dataSourceTitle) { + const updatedVegaSpec = updateDataSourceNameInVegaSpec({ + spec: vegaSpec, + newDataSourceName: dataSourceTitle, + }); - if (searchSourceString) { - const searchSource = JSON.parse(searchSourceString); - if (searchSource.index) { - const searchSourceIndex = searchSource.index.includes('_') - ? searchSource.index.split('_')[searchSource.index.split('_').length - 1] - : searchSource.index; - searchSource.index = `${dataSourceId}_` + searchSourceIndex; + // @ts-expect-error + const visStateObject = JSON.parse(object.attributes?.visState); + visStateObject.params.spec = updatedVegaSpec; // @ts-expect-error - object.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource); + object.attributes.visState = JSON.stringify(visStateObject); + object.references.push({ + id: `${dataSourceId}`, + type: 'data-source', + name: 'dataSource', + }); } } - if (visStateString) { - const visState = JSON.parse(visStateString); - const controlList = visState.params?.controls; - if (controlList) { + if (object.type === 'index-pattern') { + object.references = [ + { + id: `${dataSourceId}`, + type: 'data-source', + name: 'dataSource', + }, + ]; + } + + if (object.type === 'visualization' || object.type === 'search') { + // @ts-expect-error + const searchSourceString = object.attributes?.kibanaSavedObjectMeta?.searchSourceJSON; + // @ts-expect-error + const visStateString = object.attributes?.visState; + + if (searchSourceString) { + const searchSource = JSON.parse(searchSourceString); + if (searchSource.index) { + const searchSourceIndex = searchSource.index.includes('_') + ? searchSource.index.split('_')[searchSource.index.split('_').length - 1] + : searchSource.index; + searchSource.index = `${dataSourceId}_` + searchSourceIndex; + + // @ts-expect-error + object.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify( + searchSource + ); + } + } + + if (visStateString) { + const visState = JSON.parse(visStateString); + const controlList = visState.params?.controls; + if (controlList) { + // @ts-expect-error + controlList.map((control) => { + if (control.indexPattern) { + const controlIndexPattern = control.indexPattern.includes('_') + ? control.indexPattern.split('_')[control.indexPattern.split('_').length - 1] + : control.indexPattern; + control.indexPattern = `${dataSourceId}_` + controlIndexPattern; + } + }); + } // @ts-expect-error - controlList.map((control) => { - if (control.indexPattern) { - const controlIndexPattern = control.indexPattern.includes('_') - ? control.indexPattern.split('_')[control.indexPattern.split('_').length - 1] - : control.indexPattern; - control.indexPattern = `${dataSourceId}_` + controlIndexPattern; - } - }); + object.attributes.visState = JSON.stringify(visState); } - // @ts-expect-error - object.attributes.visState = JSON.stringify(visState); } } - } - // use the import ID map to ensure that each reference is being created with the correct ID - const references = object.references?.map((reference) => { - const { type, id } = reference; - const importIdEntry = importIdMap.get(`${type}:${id}`); + // use the import ID map to ensure that each reference is being created with the correct ID + const references = object.references?.map((reference) => { + const { type, id } = reference; + const importIdEntry = importIdMap.get(`${type}:${id}`); + if (importIdEntry?.id) { + return { ...reference, id: importIdEntry.id }; + } + return reference; + }); + // use the import ID map to ensure that each object is being created with the correct ID, also ensure that the `originId` is set on + // the created object if it did not have one (or is omitted if specified) + const importIdEntry = importIdMap.get(`${object.type}:${object.id}`); if (importIdEntry?.id) { - return { ...reference, id: importIdEntry.id }; + objectIdMap.set(`${object.type}:${importIdEntry.id}`, object); + const originId = importIdEntry.omitOriginId ? undefined : object.originId ?? object.id; + return { ...object, id: importIdEntry.id, originId, ...(references && { references }) }; } - return reference; - }); - // use the import ID map to ensure that each object is being created with the correct ID, also ensure that the `originId` is set on - // the created object if it did not have one (or is omitted if specified) - const importIdEntry = importIdMap.get(`${object.type}:${object.id}`); - if (importIdEntry?.id) { - objectIdMap.set(`${object.type}:${importIdEntry.id}`, object); - const originId = importIdEntry.omitOriginId ? undefined : object.originId ?? object.id; - return { ...object, id: importIdEntry.id, originId, ...(references && { references }) }; - } - return { ...object, ...(references && { references }) }; - }); + return { ...object, ...(references && { references }) }; + }) + ); const resolvableErrors = ['conflict', 'ambiguous_conflict', 'missing_references']; let expectedResults = objectsToCreate; if (!accumulatedErrors.some(({ error: { type } }) => resolvableErrors.includes(type))) { diff --git a/src/core/server/saved_objects/import/import_saved_objects.test.ts b/src/core/server/saved_objects/import/import_saved_objects.test.ts index 3dda6931bd1e..fff5b60c89cc 100644 --- a/src/core/server/saved_objects/import/import_saved_objects.test.ts +++ b/src/core/server/saved_objects/import/import_saved_objects.test.ts @@ -259,6 +259,7 @@ describe('#importSavedObjectsFromStream', () => { objects: collectedObjects, ignoreRegularConflicts: overwrite, dataSourceId: testDataSourceId, + savedObjectsClient, }; expect(checkConflictsForDataSource).toHaveBeenCalledWith(checkConflictsForDataSourceParams); }); diff --git a/src/core/server/saved_objects/import/import_saved_objects.ts b/src/core/server/saved_objects/import/import_saved_objects.ts index a5744478fd7d..fac10acc0f9a 100644 --- a/src/core/server/saved_objects/import/import_saved_objects.ts +++ b/src/core/server/saved_objects/import/import_saved_objects.ts @@ -117,6 +117,7 @@ export async function importSavedObjectsFromStream({ objects: checkConflictsResult.filteredObjects, ignoreRegularConflicts: overwrite, dataSourceId, + savedObjectsClient, }); checkOriginConflictsParams.objects = checkConflictsForDataSourceResult.filteredObjects; } diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.hjson b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.hjson new file mode 100644 index 000000000000..98e791db851d --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.hjson @@ -0,0 +1,147 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.json b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.json new file mode 100644 index 000000000000..8ec22019e828 --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 800, + "height": 600, + "padding": 5, + "signals": [ + {"name": "mapType", "value": "topojson"} + ], + "data": [ + { + "name": "exampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_index_name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "urlData", + "url": "https://example.com/data.json", + "format": {"type": "json"} + }, + { + "name": "topojsonData", + "url": "https://example.com/map.topojson", + "format": {"type": "topojson", "feature": "your_feature_name"} + }, + { + "name": "geojsonData", + "url": "https://example.com/map.geojson", + "format": {"type": "json"} + } + ], + "projections": [ + { + "name": "projection", + "type": {"signal": "mapType"} + } + ], + "marks": [ + { + "type": "symbol", + "from": {"data": "exampleIndexSource"}, + "encode": { + "enter": { + "x": {"field": "_source.location.lon"}, + "y": {"field": "_source.location.lat"}, + "size": {"value": 50}, + "fill": {"value": "steelblue"}, + "stroke": {"value": "white"}, + "tooltip": {"signal": "datum._source.name"} + } + } + }, + { + "type": "symbol", + "from": {"data": "urlData"}, + "encode": { + "enter": { + "x": {"field": "longitude"}, + "y": {"field": "latitude"}, + "size": {"value": 50}, + "fill": {"value": "green"}, + "stroke": {"value": "white"}, + "tooltip": {"field": "name"} + } + } + }, + { + "type": "shape", + "from": {"data": "topojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightgray"} + } + } + }, + { + "type": "shape", + "from": {"data": "geojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightblue"} + } + } + } + ] +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.hjson b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.hjson new file mode 100644 index 000000000000..6cf4dcb16db1 --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.hjson @@ -0,0 +1,148 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + data_source_name: some datasource name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.json b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.json new file mode 100644 index 000000000000..41c14b079915 --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_multiple_urls_mds.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 800, + "height": 600, + "padding": 5, + "signals": [ + {"name": "mapType", "value": "topojson"} + ], + "data": [ + { + "name": "exampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_index_name", + "data_source_name": "some datasource name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "urlData", + "url": "https://example.com/data.json", + "format": {"type": "json"} + }, + { + "name": "topojsonData", + "url": "https://example.com/map.topojson", + "format": {"type": "topojson", "feature": "your_feature_name"} + }, + { + "name": "geojsonData", + "url": "https://example.com/map.geojson", + "format": {"type": "json"} + } + ], + "projections": [ + { + "name": "projection", + "type": {"signal": "mapType"} + } + ], + "marks": [ + { + "type": "symbol", + "from": {"data": "exampleIndexSource"}, + "encode": { + "enter": { + "x": {"field": "_source.location.lon"}, + "y": {"field": "_source.location.lat"}, + "size": {"value": 50}, + "fill": {"value": "steelblue"}, + "stroke": {"value": "white"}, + "tooltip": {"signal": "datum._source.name"} + } + } + }, + { + "type": "symbol", + "from": {"data": "urlData"}, + "encode": { + "enter": { + "x": {"field": "longitude"}, + "y": {"field": "latitude"}, + "size": {"value": 50}, + "fill": {"value": "green"}, + "stroke": {"value": "white"}, + "tooltip": {"field": "name"} + } + } + }, + { + "type": "shape", + "from": {"data": "topojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightgray"} + } + } + }, + { + "type": "shape", + "from": {"data": "geojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightblue"} + } + } + } + ] +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.hjson b/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.hjson new file mode 100644 index 000000000000..17f3f2e482ea --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.hjson @@ -0,0 +1,61 @@ +{ + $schema: https://vega.github.io/schema/vega-lite/v5.json + data: { + url: { + %context%: true + %timefield%: @timestamp + index: opensearch_dashboards_sample_data_logs + body: { + aggs: { + 1: { + terms: { + field: geo.dest + order: { + _count: desc + } + size: 5 + } + } + } + } + } + format: { + property: aggregations.1.buckets + } + } + transform: [ + { + calculate: datum.key + as: dest + } + { + calculate: datum.doc_count + as: count + } + ] + layer: [ + { + mark: { + type: bar + tooltip: true + } + } + ] + encoding: { + x: { + field: count + type: quantitative + axis: { + title: Count + } + } + y: { + field: dest + type: nominal + axis: { + title: Dest + } + sort: -x + } + } +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.json b/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.json new file mode 100644 index 000000000000..49392f5de16e --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_with_opensearch_query.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": { + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "opensearch_dashboards_sample_data_logs", + "body": { + "aggs": { + "1": { + "terms": { + "field": "geo.dest", + "order": {"_count": "desc"}, + "size": 5 + } + } + } + } + }, + "format": {"property": "aggregations.1.buckets"} + }, + "transform": [ + {"calculate": "datum.key", "as": "dest"}, + {"calculate": "datum.doc_count", "as": "count"} + ], + "layer": [{"mark": {"type": "bar", "tooltip": true}}], + "encoding": { + "x": {"field": "count", "type": "quantitative", "axis": {"title": "Count"}}, + "y": { + "field": "dest", + "type": "nominal", + "axis": {"title": "Dest"}, + "sort": "-x" + } + } +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.hjson b/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.hjson new file mode 100644 index 000000000000..8c4a0193ba97 --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.hjson @@ -0,0 +1,117 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 400 + height: 200 + padding: 5 + // Data contained entirely within the spec + data: [ + { + name: table + values: [ + { + category: A + count: 28 + } + { + category: B + count: 55 + } + { + category: C + count: 43 + } + { + category: D + count: 91 + } + { + category: E + count: 81 + } + { + category: F + count: 53 + } + { + category: G + count: 19 + } + { + category: H + count: 87 + } + ] + } + ] + scales: [ + { + name: xscale + type: band + domain: { + data: table + field: category + } + range: width + padding: 0.05 + round: true + } + { + name: yscale + type: linear + domain: { + data: table + field: count + } + range: height + nice: true + } + ] + axes: [ + { + orient: bottom + scale: xscale + } + { + orient: left + scale: yscale + } + ] + marks: [ + { + type: rect + from: { + data: table + } + encode: { + enter: { + x: { + scale: xscale + field: category + } + width: { + scale: xscale + band: 1 + } + y: { + scale: yscale + field: count + } + y2: { + scale: yscale + value: 0 + } + } + update: { + fill: { + value: steelblue + } + } + hover: { + fill: { + value: red + } + } + } + } + ] +} diff --git a/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.json b/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.json new file mode 100644 index 000000000000..d24b9b207372 --- /dev/null +++ b/src/core/server/saved_objects/import/test_utils/vega_spec_without_opensearch_query.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 400, + "height": 200, + "padding": 5, + + "data": [ + { + "name": "table", + "values": [ + {"category": "A", "count": 28}, + {"category": "B", "count": 55}, + {"category": "C", "count": 43}, + {"category": "D", "count": 91}, + {"category": "E", "count": 81}, + {"category": "F", "count": 53}, + {"category": "G", "count": 19}, + {"category": "H", "count": 87} + ] + } + ], + + "scales": [ + { + "name": "xscale", + "type": "band", + "domain": {"data": "table", "field": "category"}, + "range": "width", + "padding": 0.05, + "round": true + }, + { + "name": "yscale", + "type": "linear", + "domain": {"data": "table", "field": "count"}, + "range": "height", + "nice": true + } + ], + + "axes": [ + { "orient": "bottom", "scale": "xscale" }, + { "orient": "left", "scale": "yscale" } + ], + + "marks": [ + { + "type": "rect", + "from": {"data": "table"}, + "encode": { + "enter": { + "x": {"scale": "xscale", "field": "category"}, + "width": {"scale": "xscale", "band": 1}, + "y": {"scale": "yscale", "field": "count"}, + "y2": {"scale": "yscale", "value": 0} + }, + "update": { + "fill": {"value": "steelblue"} + }, + "hover": { + "fill": {"value": "red"} + } + } + } + ] + } diff --git a/src/core/server/saved_objects/import/utils.test.ts b/src/core/server/saved_objects/import/utils.test.ts new file mode 100644 index 000000000000..604b6f6d473f --- /dev/null +++ b/src/core/server/saved_objects/import/utils.test.ts @@ -0,0 +1,247 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { readFileSync } from 'fs'; +import { + extractVegaSpecFromSavedObject, + getDataSourceTitleFromId, + updateDataSourceNameInVegaSpec, +} from './utils'; +import { parse } from 'hjson'; +import { isEqual } from 'lodash'; +import { join } from 'path'; +import { SavedObject, SavedObjectsClientContract } from '../types'; + +describe('updateDataSourceNameInVegaSpec()', () => { + const loadHJSONStringFromFile = (filepath: string) => { + return readFileSync(join(__dirname, filepath)).toString(); + }; + + const loadJSONFromFile = (filepath: string) => { + return JSON.parse(readFileSync(join(__dirname, filepath)).toString()); + }; + + /* + JSON Test cases + */ + test('(JSON) When data has only one url body and it is an opensearch query, add data_source_name field to the spec', () => { + const openSearchQueryJSON = loadJSONFromFile( + './test_utils/vega_spec_with_opensearch_query.json' + ); + const jsonString = JSON.stringify(openSearchQueryJSON); + const modifiedString = JSON.parse( + updateDataSourceNameInVegaSpec({ spec: jsonString, newDataSourceName: 'newDataSource' }) + ); + + expect(modifiedString.data.url.hasOwnProperty('data_source_name')).toBe(true); + expect(modifiedString.data.url.data_source_name).toBe('newDataSource'); + + // These fields should be unchanged + Object.keys(openSearchQueryJSON).forEach((field) => { + if (field !== 'data') { + expect( + isEqual( + modifiedString[field as keyof typeof openSearchQueryJSON], + openSearchQueryJSON[field as keyof typeof openSearchQueryJSON] + ) + ).toBe(true); + } + }); + }); + + test('(JSON) When data has only one url body and it is not an opensearch query, change nothing', () => { + const nonOpenSearchQueryJSON = loadJSONFromFile( + './test_utils/vega_spec_without_opensearch_query.json' + ); + const jsonString = JSON.stringify(nonOpenSearchQueryJSON); + const modifiedJSON = JSON.parse( + updateDataSourceNameInVegaSpec({ spec: jsonString, newDataSourceName: 'noDataSource' }) + ); + expect(isEqual(modifiedJSON, nonOpenSearchQueryJSON)).toBe(true); + }); + + test('(JSON) When data has multiple url bodies, make sure only opensearch queries are updated with data_source_names', () => { + const multipleDataSourcesJSON = loadJSONFromFile( + './test_utils/vega_spec_with_multiple_urls.json' + ); + const jsonString = JSON.stringify(multipleDataSourcesJSON); + const modifiedString = JSON.parse( + updateDataSourceNameInVegaSpec({ spec: jsonString, newDataSourceName: 'newDataSource' }) + ); + + expect(modifiedString.data.length).toBe(multipleDataSourcesJSON.data.length); + for (let i = 0; i < modifiedString.data.length; i++) { + const originalUrlBody = multipleDataSourcesJSON.data[i]; + const urlBody = modifiedString.data[i]; + + if (urlBody.name !== 'exampleIndexSource') { + expect(isEqual(originalUrlBody, urlBody)).toBe(true); + } else { + expect(urlBody.url.hasOwnProperty('data_source_name')).toBe(true); + expect(urlBody.url.data_source_name).toBe('newDataSource'); + } + } + + // These fields should be unchanged + Object.keys(multipleDataSourcesJSON).forEach((field) => { + if (field !== 'data') { + expect( + isEqual( + modifiedString[field as keyof typeof multipleDataSourcesJSON], + multipleDataSourcesJSON[field as keyof typeof multipleDataSourcesJSON] + ) + ).toBe(true); + } + }); + }); + + test('(JSON) When an MDS object does not reference local queries, return the same spec', () => { + const multipleDataSourcesJSONMds = loadJSONFromFile( + './test_utils/vega_spec_with_multiple_urls_mds.json' + ); + const jsonString = JSON.stringify(multipleDataSourcesJSONMds); + const modifiedJSON = JSON.parse( + updateDataSourceNameInVegaSpec({ spec: jsonString, newDataSourceName: 'noDataSource' }) + ); + expect(isEqual(modifiedJSON, multipleDataSourcesJSONMds)).toBe(true); + }); + + /* + HJSON Test cases + */ + test('(HJSON) When data has only one url body and it is an opensearch query, add data_source_name field to the spec', () => { + const hjsonString = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_opensearch_query.hjson' + ); + + const originalHJSONParse = parse(hjsonString, { keepWsc: true }); + const hjsonParse = parse( + updateDataSourceNameInVegaSpec({ spec: hjsonString, newDataSourceName: 'newDataSource' }), + { + keepWsc: true, + } + ); + + expect(hjsonParse.data.url.hasOwnProperty('data_source_name')).toBe(true); + expect(hjsonParse.data.url.data_source_name).toBe('newDataSource'); + + // These fields should be unchanged + Object.keys(originalHJSONParse).forEach((field) => { + if (field !== 'data') { + expect( + isEqual( + originalHJSONParse[field as keyof typeof originalHJSONParse], + hjsonParse[field as keyof typeof originalHJSONParse] + ) + ).toBe(true); + } + }); + }); + + test('(HJSON) When data has only one url body and it is not an opensearch query, change nothing', () => { + const hjsonString = loadHJSONStringFromFile( + '/test_utils/vega_spec_without_opensearch_query.hjson' + ); + const originalHJSONParse = parse(hjsonString, { keepWsc: true }); + const hjsonParse = parse( + updateDataSourceNameInVegaSpec({ spec: hjsonString, newDataSourceName: 'noDataSource' }) + ); + + expect(isEqual(originalHJSONParse, hjsonParse)).toBe(true); + }); + + test('(HJSON) When data has multiple url bodies, make sure only opensearch queries are updated with data_source_names', () => { + const hjsonString = loadHJSONStringFromFile('/test_utils/vega_spec_with_multiple_urls.hjson'); + const originalHJSONParse = parse(hjsonString, { keepWsc: true }); + const hjsonParse = parse( + updateDataSourceNameInVegaSpec({ spec: hjsonString, newDataSourceName: 'newDataSource' }) + ); + + expect(hjsonParse.data.length).toBe(originalHJSONParse.data.length); + for (let i = 0; i < hjsonParse.data.length; i++) { + const originalUrlBody = originalHJSONParse.data[i]; + const urlBody = hjsonParse.data[i]; + + if (urlBody.name !== 'exampleIndexSource') { + expect(isEqual(originalUrlBody, urlBody)).toBe(true); + } else { + expect(urlBody.url.hasOwnProperty('data_source_name')).toBe(true); + expect(urlBody.url.data_source_name).toBe('newDataSource'); + } + } + + // These fields should be unchanged + Object.keys(originalHJSONParse).forEach((field) => { + if (field !== 'data') { + expect( + isEqual( + originalHJSONParse[field as keyof typeof originalHJSONParse], + hjsonParse[field as keyof typeof originalHJSONParse] + ) + ).toBe(true); + } + }); + }); + + test('(HJSON) When an MDS object does not reference local queries, return the same spec', () => { + const hjsonString = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_multiple_urls_mds.hjson' + ); + const originalHJSONParse = parse(hjsonString, { keepWsc: true }); + const hjsonParse = parse( + updateDataSourceNameInVegaSpec({ spec: hjsonString, newDataSourceName: 'newDataSource' }) + ); + + expect(isEqual(originalHJSONParse, hjsonParse)).toBe(true); + }); +}); + +describe('extractVegaSpecFromSavedObject()', () => { + test('For a Vega visualization saved object, return its spec', () => { + const spec = 'some-vega-spec'; + const vegaSavedObject = { + attributes: { + visState: `{"type": "vega", "params": {"spec": "${spec}"}}`, + }, + } as SavedObject; + + expect(extractVegaSpecFromSavedObject(vegaSavedObject)).toBe(spec); + }); + + test('For another saved object type, return undefined', () => { + const nonVegaSavedObject = { + attributes: { + visState: `{"type": "area", "params": {"spec": "some-spec"}}`, + }, + } as SavedObject; + + expect(extractVegaSpecFromSavedObject(nonVegaSavedObject)).toBe(undefined); + }); +}); + +describe('getDataSourceTitleFromId()', () => { + const savedObjectsClient = {} as SavedObjectsClientContract; + savedObjectsClient.get = jest.fn().mockImplementation((type, id) => { + if (type === 'data-source' && id === 'valid-id') { + return Promise.resolve({ + attributes: { + title: 'some-datasource-title', + }, + }); + } + + return Promise.resolve({}); + }); + + test('When a valid id is passed, return the correct title', async () => { + expect(await getDataSourceTitleFromId('valid-id', savedObjectsClient)).toBe( + 'some-datasource-title' + ); + }); + + test('When a nonexistent id is passed, return nothing', async () => { + expect(await getDataSourceTitleFromId('nonexistent-id', savedObjectsClient)).toBe(undefined); + }); +}); diff --git a/src/core/server/saved_objects/import/utils.ts b/src/core/server/saved_objects/import/utils.ts new file mode 100644 index 000000000000..9bb1d10cd0eb --- /dev/null +++ b/src/core/server/saved_objects/import/utils.ts @@ -0,0 +1,103 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { parse, stringify } from 'hjson'; +import { SavedObject, SavedObjectsClientContract } from '../types'; + +export interface UpdateDataSourceNameInVegaSpecProps { + spec: string; + newDataSourceName: string; +} + +export const updateDataSourceNameInVegaSpec = ( + props: UpdateDataSourceNameInVegaSpecProps +): string => { + const { spec } = props; + + let parsedSpec = parseJSONSpec(spec); + const isJSONString = !!parsedSpec; + if (!parsedSpec) { + parsedSpec = parse(spec, { keepWsc: true }); + } + + const dataField = parsedSpec.data; + + if (dataField instanceof Array) { + parsedSpec.data = dataField.map((dataObject) => { + return updateDataSourceNameForDataObject(dataObject, props); + }); + } else if (dataField instanceof Object) { + parsedSpec.data = updateDataSourceNameForDataObject(dataField, props); + } else { + throw new Error(`"data" field should be an object or an array of objects`); + } + + return isJSONString + ? JSON.stringify(parsedSpec) + : stringify(parsedSpec, { + bracesSameLine: true, + keepWsc: true, + }); +}; + +export const getDataSourceTitleFromId = async ( + dataSourceId: string, + savedObjectsClient: SavedObjectsClientContract +) => { + return await savedObjectsClient.get('data-source', dataSourceId).then((response) => { + // @ts-expect-error + return response?.attributes?.title ?? undefined; + }); +}; + +export const extractVegaSpecFromSavedObject = (savedObject: SavedObject) => { + if (isVegaVisualization(savedObject)) { + // @ts-expect-error + const visStateObject = JSON.parse(savedObject.attributes?.visState); + return visStateObject.params.spec; + } + + return undefined; +}; + +const isVegaVisualization = (savedObject: SavedObject) => { + // @ts-expect-error + const visState = savedObject.attributes?.visState; + if (!!visState) { + const visStateObject = JSON.parse(visState); + return !!visStateObject.type && visStateObject.type === 'vega'; + } + return false; +}; + +const updateDataSourceNameForDataObject = ( + dataObject: any, + props: UpdateDataSourceNameInVegaSpecProps +) => { + const { newDataSourceName } = props; + if ( + dataObject.hasOwnProperty('url') && + dataObject.url.hasOwnProperty('index') && + !dataObject.url.hasOwnProperty('data_source_name') + ) { + dataObject.url.data_source_name = newDataSourceName; + } + + return dataObject; +}; + +const parseJSONSpec = (spec: string) => { + try { + const jsonSpec = JSON.parse(spec); + + if (jsonSpec && typeof jsonSpec === 'object') { + return jsonSpec; + } + } catch (e) { + return undefined; + } + + return undefined; +}; diff --git a/src/plugins/vis_type_vega/server/plugin.ts b/src/plugins/vis_type_vega/server/plugin.ts index cf3339211698..4451cb70a28f 100644 --- a/src/plugins/vis_type_vega/server/plugin.ts +++ b/src/plugins/vis_type_vega/server/plugin.ts @@ -36,6 +36,11 @@ import { VisTypeVegaPluginSetup, VisTypeVegaPluginStart, } from './types'; +import { + VEGA_VISUALIZATION_CLIENT_WRAPPER_ID, + vegaVisualizationClientWrapper, +} from './vega_visualization_client_wrapper'; +import { setDataSourceEnabled } from './services'; export class VisTypeVegaPlugin implements Plugin { private readonly config: ConfigObservable; @@ -44,10 +49,19 @@ export class VisTypeVegaPlugin implements Plugin('DataSource'); diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_outdated_references_mds.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_outdated_references_mds.hjson new file mode 100644 index 000000000000..5b23c66e67fb --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_outdated_references_mds.hjson @@ -0,0 +1,223 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: localExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: local_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: otherExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_other_index_name + data_source_name: a-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + data_source_name: b-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSourceC + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name_c + data_source_name: c-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSourceD + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name_d + data_source_name: d-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_up_to_date_urls_mds.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_up_to_date_urls_mds.hjson new file mode 100644 index 000000000000..8336fe9ac7de --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_up_to_date_urls_mds.hjson @@ -0,0 +1,185 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: localExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: local_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: otherExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_other_index_name + data_source_name: a-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + data_source_name: b-title + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.hjson new file mode 100644 index 000000000000..d8085c5923f3 --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.hjson @@ -0,0 +1,165 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: otherExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_other_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.json b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.json new file mode 100644 index 000000000000..440fc26784e8 --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls.json @@ -0,0 +1,110 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 800, + "height": 600, + "padding": 5, + "signals": [ + {"name": "mapType", "value": "topojson"} + ], + "data": [ + { + "name": "otherExampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_other_index_name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "exampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_index_name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "urlData", + "url": "https://example.com/data.json", + "format": {"type": "json"} + }, + { + "name": "topojsonData", + "url": "https://example.com/map.topojson", + "format": {"type": "topojson", "feature": "your_feature_name"} + }, + { + "name": "geojsonData", + "url": "https://example.com/map.geojson", + "format": {"type": "json"} + } + ], + "projections": [ + { + "name": "projection", + "type": {"signal": "mapType"} + } + ], + "marks": [ + { + "type": "symbol", + "from": {"data": "exampleIndexSource"}, + "encode": { + "enter": { + "x": {"field": "_source.location.lon"}, + "y": {"field": "_source.location.lat"}, + "size": {"value": 50}, + "fill": {"value": "steelblue"}, + "stroke": {"value": "white"}, + "tooltip": {"signal": "datum._source.name"} + } + } + }, + { + "type": "symbol", + "from": {"data": "urlData"}, + "encode": { + "enter": { + "x": {"field": "longitude"}, + "y": {"field": "latitude"}, + "size": {"value": 50}, + "fill": {"value": "green"}, + "stroke": {"value": "white"}, + "tooltip": {"field": "name"} + } + } + }, + { + "type": "shape", + "from": {"data": "topojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightgray"} + } + } + }, + { + "type": "shape", + "from": {"data": "geojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightblue"} + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.hjson new file mode 100644 index 000000000000..b92cdfca9886 --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.hjson @@ -0,0 +1,185 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 800 + height: 600 + padding: 5 + signals: [ + { + name: mapType + value: topojson + } + ] + // Every data source type that Dashboards supports + data: [ + { + name: localExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: local_index_name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: otherExampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_other_index_name + data_source_name: some other datasource name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: exampleIndexSource + url: { + %context%: true + %timefield%: @timestamp + index: your_index_name + data_source_name: some datasource name + body: { + size: 1000 + query: { + match_all: { + } + } + } + } + format: { + property: hits.hits + } + } + { + name: urlData + url: https://example.com/data.json + format: { + type: json + } + } + { + name: topojsonData + url: https://example.com/map.topojson + format: { + type: topojson + feature: your_feature_name + } + } + { + name: geojsonData + url: https://example.com/map.geojson + format: { + type: json + } + } + ] + projections: [ + { + name: projection + type: { + signal: mapType + } + } + ] + marks: [ + { + type: symbol + from: { + data: exampleIndexSource + } + encode: { + enter: { + x: { + field: _source.location.lon + } + y: { + field: _source.location.lat + } + size: { + value: 50 + } + fill: { + value: steelblue + } + stroke: { + value: white + } + tooltip: { + signal: datum._source.name + } + } + } + } + { + type: symbol + from: { + data: urlData + } + encode: { + enter: { + x: { + field: longitude + } + y: { + field: latitude + } + size: { + value: 50 + } + fill: { + value: green + } + stroke: { + value: white + } + tooltip: { + field: name + } + } + } + } + { + type: shape + from: { + data: topojsonData + } + encode: { + enter: { + fill: { + value: lightgray + } + } + } + } + { + type: shape + from: { + data: geojsonData + } + encode: { + enter: { + fill: { + value: lightblue + } + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.json b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.json new file mode 100644 index 000000000000..3e883388bc5c --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_multiple_urls_mds.json @@ -0,0 +1,127 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 800, + "height": 600, + "padding": 5, + "signals": [ + {"name": "mapType", "value": "topojson"} + ], + "data": [ + { + "name": "localExampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "local_index_name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "otherExampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_other_index_name", + "data_source_name": "some other datasource name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "exampleIndexSource", + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "your_index_name", + "data_source_name": "some datasource name", + "body": { + "size": 1000, + "query": { + "match_all": {} + } + } + }, + "format": {"property": "hits.hits"} + }, + { + "name": "urlData", + "url": "https://example.com/data.json", + "format": {"type": "json"} + }, + { + "name": "topojsonData", + "url": "https://example.com/map.topojson", + "format": {"type": "topojson", "feature": "your_feature_name"} + }, + { + "name": "geojsonData", + "url": "https://example.com/map.geojson", + "format": {"type": "json"} + } + ], + "projections": [ + { + "name": "projection", + "type": {"signal": "mapType"} + } + ], + "marks": [ + { + "type": "symbol", + "from": {"data": "exampleIndexSource"}, + "encode": { + "enter": { + "x": {"field": "_source.location.lon"}, + "y": {"field": "_source.location.lat"}, + "size": {"value": 50}, + "fill": {"value": "steelblue"}, + "stroke": {"value": "white"}, + "tooltip": {"signal": "datum._source.name"} + } + } + }, + { + "type": "symbol", + "from": {"data": "urlData"}, + "encode": { + "enter": { + "x": {"field": "longitude"}, + "y": {"field": "latitude"}, + "size": {"value": 50}, + "fill": {"value": "green"}, + "stroke": {"value": "white"}, + "tooltip": {"field": "name"} + } + } + }, + { + "type": "shape", + "from": {"data": "topojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightgray"} + } + } + }, + { + "type": "shape", + "from": {"data": "geojsonData"}, + "encode": { + "enter": { + "fill": {"value": "lightblue"} + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.hjson new file mode 100644 index 000000000000..17f3f2e482ea --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.hjson @@ -0,0 +1,61 @@ +{ + $schema: https://vega.github.io/schema/vega-lite/v5.json + data: { + url: { + %context%: true + %timefield%: @timestamp + index: opensearch_dashboards_sample_data_logs + body: { + aggs: { + 1: { + terms: { + field: geo.dest + order: { + _count: desc + } + size: 5 + } + } + } + } + } + format: { + property: aggregations.1.buckets + } + } + transform: [ + { + calculate: datum.key + as: dest + } + { + calculate: datum.doc_count + as: count + } + ] + layer: [ + { + mark: { + type: bar + tooltip: true + } + } + ] + encoding: { + x: { + field: count + type: quantitative + axis: { + title: Count + } + } + y: { + field: dest + type: nominal + axis: { + title: Dest + } + sort: -x + } + } +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.json b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.json new file mode 100644 index 000000000000..49392f5de16e --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": { + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "opensearch_dashboards_sample_data_logs", + "body": { + "aggs": { + "1": { + "terms": { + "field": "geo.dest", + "order": {"_count": "desc"}, + "size": 5 + } + } + } + } + }, + "format": {"property": "aggregations.1.buckets"} + }, + "transform": [ + {"calculate": "datum.key", "as": "dest"}, + {"calculate": "datum.doc_count", "as": "count"} + ], + "layer": [{"mark": {"type": "bar", "tooltip": true}}], + "encoding": { + "x": {"field": "count", "type": "quantitative", "axis": {"title": "Count"}}, + "y": { + "field": "dest", + "type": "nominal", + "axis": {"title": "Dest"}, + "sort": "-x" + } + } +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.hjson new file mode 100644 index 000000000000..7f307e84b0af --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.hjson @@ -0,0 +1,62 @@ +{ + $schema: https://vega.github.io/schema/vega-lite/v5.json + data: { + url: { + %context%: true + %timefield%: @timestamp + index: opensearch_dashboards_sample_data_logs + data_source_name: example data source + body: { + aggs: { + 1: { + terms: { + field: geo.dest + order: { + _count: desc + } + size: 5 + } + } + } + } + } + format: { + property: aggregations.1.buckets + } + } + transform: [ + { + calculate: datum.key + as: dest + } + { + calculate: datum.doc_count + as: count + } + ] + layer: [ + { + mark: { + type: bar + tooltip: true + } + } + ] + encoding: { + x: { + field: count + type: quantitative + axis: { + title: Count + } + } + y: { + field: dest + type: nominal + axis: { + title: Dest + } + sort: -x + } + } +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.json b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.json new file mode 100644 index 000000000000..7b90845be17d --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_with_opensearch_query_mds.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": { + "url": { + "%context%": true, + "%timefield%": "@timestamp", + "index": "opensearch_dashboards_sample_data_logs", + "data_source_name": "example data source", + "body": { + "aggs": { + "1": { + "terms": { + "field": "geo.dest", + "order": {"_count": "desc"}, + "size": 5 + } + } + } + } + }, + "format": {"property": "aggregations.1.buckets"} + }, + "transform": [ + {"calculate": "datum.key", "as": "dest"}, + {"calculate": "datum.doc_count", "as": "count"} + ], + "layer": [{"mark": {"type": "bar", "tooltip": true}}], + "encoding": { + "x": {"field": "count", "type": "quantitative", "axis": {"title": "Count"}}, + "y": { + "field": "dest", + "type": "nominal", + "axis": {"title": "Dest"}, + "sort": "-x" + } + } +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.hjson b/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.hjson new file mode 100644 index 000000000000..8c4a0193ba97 --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.hjson @@ -0,0 +1,117 @@ +{ + $schema: https://vega.github.io/schema/vega/v5.json + width: 400 + height: 200 + padding: 5 + // Data contained entirely within the spec + data: [ + { + name: table + values: [ + { + category: A + count: 28 + } + { + category: B + count: 55 + } + { + category: C + count: 43 + } + { + category: D + count: 91 + } + { + category: E + count: 81 + } + { + category: F + count: 53 + } + { + category: G + count: 19 + } + { + category: H + count: 87 + } + ] + } + ] + scales: [ + { + name: xscale + type: band + domain: { + data: table + field: category + } + range: width + padding: 0.05 + round: true + } + { + name: yscale + type: linear + domain: { + data: table + field: count + } + range: height + nice: true + } + ] + axes: [ + { + orient: bottom + scale: xscale + } + { + orient: left + scale: yscale + } + ] + marks: [ + { + type: rect + from: { + data: table + } + encode: { + enter: { + x: { + scale: xscale + field: category + } + width: { + scale: xscale + band: 1 + } + y: { + scale: yscale + field: count + } + y2: { + scale: yscale + value: 0 + } + } + update: { + fill: { + value: steelblue + } + } + hover: { + fill: { + value: red + } + } + } + } + ] +} diff --git a/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.json b/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.json new file mode 100644 index 000000000000..d24b9b207372 --- /dev/null +++ b/src/plugins/vis_type_vega/server/test_utils/vega_spec_without_opensearch_query.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "width": 400, + "height": 200, + "padding": 5, + + "data": [ + { + "name": "table", + "values": [ + {"category": "A", "count": 28}, + {"category": "B", "count": 55}, + {"category": "C", "count": 43}, + {"category": "D", "count": 91}, + {"category": "E", "count": 81}, + {"category": "F", "count": 53}, + {"category": "G", "count": 19}, + {"category": "H", "count": 87} + ] + } + ], + + "scales": [ + { + "name": "xscale", + "type": "band", + "domain": {"data": "table", "field": "category"}, + "range": "width", + "padding": 0.05, + "round": true + }, + { + "name": "yscale", + "type": "linear", + "domain": {"data": "table", "field": "count"}, + "range": "height", + "nice": true + } + ], + + "axes": [ + { "orient": "bottom", "scale": "xscale" }, + { "orient": "left", "scale": "yscale" } + ], + + "marks": [ + { + "type": "rect", + "from": {"data": "table"}, + "encode": { + "enter": { + "x": {"scale": "xscale", "field": "category"}, + "width": {"scale": "xscale", "band": 1}, + "y": {"scale": "yscale", "field": "count"}, + "y2": {"scale": "yscale", "value": 0} + }, + "update": { + "fill": {"value": "steelblue"} + }, + "hover": { + "fill": {"value": "red"} + } + } + } + ] + } diff --git a/src/plugins/vis_type_vega/server/types.ts b/src/plugins/vis_type_vega/server/types.ts index 9695f6dc23d7..bcf4120577aa 100644 --- a/src/plugins/vis_type_vega/server/types.ts +++ b/src/plugins/vis_type_vega/server/types.ts @@ -29,6 +29,7 @@ */ import { Observable } from 'rxjs'; +import { DataSourcePluginSetup } from 'src/plugins/data_source/server'; import { HomeServerPluginSetup } from '../../home/server'; import { UsageCollectionSetup } from '../../usage_collection/server'; @@ -45,6 +46,7 @@ export interface VegaSavedObjectAttributes { export interface VisTypeVegaPluginSetupDependencies { usageCollection?: UsageCollectionSetup; home?: HomeServerPluginSetup; + dataSource?: DataSourcePluginSetup; } // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/src/plugins/vis_type_vega/server/utils.test.ts b/src/plugins/vis_type_vega/server/utils.test.ts new file mode 100644 index 000000000000..73d0f82954cb --- /dev/null +++ b/src/plugins/vis_type_vega/server/utils.test.ts @@ -0,0 +1,181 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + extractDataSourceNamesInVegaSpec, + extractVegaSpecFromAttributes, + findDataSourceIdbyName, +} from './utils'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { SavedObjectsClientContract, SavedObjectsFindOptions } from 'src/core/server'; + +describe('findDataSourceIdbyName()', () => { + const savedObjectsClient = {} as SavedObjectsClientContract; + savedObjectsClient.find = jest.fn().mockImplementation((query: SavedObjectsFindOptions) => { + if (query.search === `"uniqueDataSource"`) { + return Promise.resolve({ + total: 1, + saved_objects: [{ id: 'some-datasource-id', attributes: { title: 'uniqueDataSource' } }], + }); + } else if (query.search === `"duplicateDataSource"`) { + return Promise.resolve({ + total: 2, + saved_objects: [ + { id: 'some-datasource-id', attributes: { title: 'duplicateDataSource' } }, + { id: 'some-other-datasource-id', attributes: { title: 'duplicateDataSource' } }, + ], + }); + } else if (query.search === `"DataSource"`) { + return Promise.resolve({ + total: 2, + saved_objects: [ + { id: 'some-datasource-id', attributes: { title: 'DataSource' } }, + { id: 'some-other-datasource-id', attributes: { title: 'DataSource Copy' } }, + ], + }); + } else { + return Promise.resolve({ + total: 0, + saved_objects: [], + }); + } + }); + + test('If no matching dataSourceName, then throw error', () => { + expect( + findDataSourceIdbyName({ dataSourceName: 'nonexistentDataSource', savedObjectsClient }) + ).rejects.toThrowError( + 'Expected exactly 1 result for data_source_name "nonexistentDataSource" but got 0 results' + ); + }); + + test('If duplicate dataSourceNames, then throw error', () => { + expect( + findDataSourceIdbyName({ dataSourceName: 'duplicateDataSource', savedObjectsClient }) + ).rejects.toThrowError( + 'Expected exactly 1 result for data_source_name "duplicateDataSource" but got 2 results' + ); + }); + + test('If dataSource is enabled but only one dataSourceName, then return id', async () => { + expect( + await findDataSourceIdbyName({ dataSourceName: 'uniqueDataSource', savedObjectsClient }) + ).toBe('some-datasource-id'); + }); + + test('If dataSource is enabled and the dataSourceName is a prefix of another, ensure the prefix is only returned', async () => { + expect(await findDataSourceIdbyName({ dataSourceName: 'DataSource', savedObjectsClient })).toBe( + 'some-datasource-id' + ); + }); +}); + +describe('extractDataSourceNamesInVegaSpec()', () => { + const loadHJSONStringFromFile = (filepath: string) => { + return readFileSync(join(__dirname, filepath)).toString(); + }; + + const loadJSONFromFile = (filepath: string) => { + return JSON.parse(readFileSync(join(__dirname, filepath)).toString()); + }; + + // JSON test cases + test('(JSON) Set should be empty when no queries are in the Vega spec', () => { + const noQueryJSON = loadJSONFromFile('/test_utils/vega_spec_without_opensearch_query.json'); + expect(extractDataSourceNamesInVegaSpec(JSON.stringify(noQueryJSON))).toMatchObject(new Set()); + }); + + test('(JSON) Set should be empty when one local cluster query is in the Vega spec', () => { + const oneLocalQueryJSON = loadJSONFromFile('/test_utils/vega_spec_with_opensearch_query.json'); + expect(extractDataSourceNamesInVegaSpec(JSON.stringify(oneLocalQueryJSON))).toMatchObject( + new Set() + ); + }); + + test('(JSON) Set should have exactly one data_source_name when one data source query is in the Vega spec', () => { + const oneDataSourceQueryJSON = loadJSONFromFile( + '/test_utils/vega_spec_with_opensearch_query_mds.json' + ); + expect(extractDataSourceNamesInVegaSpec(JSON.stringify(oneDataSourceQueryJSON))).toMatchObject( + new Set(['example data source']) + ); + }); + + test('(JSON) Set should be empty when many local cluster queries are in the Vega spec', () => { + const manyLocalQueriesJSON = loadJSONFromFile('/test_utils/vega_spec_with_multiple_urls.json'); + expect(extractDataSourceNamesInVegaSpec(JSON.stringify(manyLocalQueriesJSON))).toMatchObject( + new Set() + ); + }); + + test('(JSON) Set have multiple data_source_name fields when the Vega spec has a mix of local cluster and data source queries', () => { + const manyDataSourceQueriesJSON = loadJSONFromFile( + '/test_utils/vega_spec_with_multiple_urls_mds.json' + ); + expect( + extractDataSourceNamesInVegaSpec(JSON.stringify(manyDataSourceQueriesJSON)) + ).toMatchObject(new Set(['some other datasource name', 'some datasource name'])); + }); + + // HJSON test cases + test('(HJSON) Set should be empty when no queries are in the Vega spec', () => { + const noQueryHJSON = loadHJSONStringFromFile( + '/test_utils/vega_spec_without_opensearch_query.hjson' + ); + expect(extractDataSourceNamesInVegaSpec(noQueryHJSON)).toMatchObject(new Set()); + }); + + test('(HJSON) Set should be empty when one local cluster query is in the Vega spec', () => { + const oneLocalQueryHJSON = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_opensearch_query.hjson' + ); + expect(extractDataSourceNamesInVegaSpec(oneLocalQueryHJSON)).toMatchObject(new Set()); + }); + + test('(HJSON) Set should have exactly one data_source_name when one data source query is in the Vega spec', () => { + const oneDataSourceQueryHJSON = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_opensearch_query_mds.hjson' + ); + expect(extractDataSourceNamesInVegaSpec(oneDataSourceQueryHJSON)).toMatchObject( + new Set(['example data source']) + ); + }); + + test('(HJSON) Set should be empty when many local cluster queries are in the Vega spec', () => { + const manyLocalQueriesHJSON = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_multiple_urls.hjson' + ); + expect(extractDataSourceNamesInVegaSpec(manyLocalQueriesHJSON)).toMatchObject(new Set()); + }); + + test('(HJSON) Set have multiple data_source_name fields when the Vega spec has a mix of local cluster and data source queries', () => { + const manyDataSourceQueriesHJSON = loadHJSONStringFromFile( + '/test_utils/vega_spec_with_multiple_urls_mds.hjson' + ); + expect(extractDataSourceNamesInVegaSpec(manyDataSourceQueriesHJSON)).toMatchObject( + new Set(['some other datasource name', 'some datasource name']) + ); + }); +}); + +describe('extractVegaSpecFromSavedObject()', () => { + test('For a Vega visualization saved object, return its spec', () => { + const spec = 'some-vega-spec'; + const vegaAttributes = { + visState: `{"type": "vega", "params": {"spec": "${spec}"}}`, + }; + + expect(extractVegaSpecFromAttributes(vegaAttributes)).toBe(spec); + }); + + test('For another saved object type, return undefined', () => { + const nonVegaAttributes = { + visState: `{"type": "area", "params": {"spec": "some-spec"}}`, + }; + + expect(extractVegaSpecFromAttributes(nonVegaAttributes)).toBe(undefined); + }); +}); diff --git a/src/plugins/vis_type_vega/server/utils.ts b/src/plugins/vis_type_vega/server/utils.ts new file mode 100644 index 000000000000..f8c83dce531e --- /dev/null +++ b/src/plugins/vis_type_vega/server/utils.ts @@ -0,0 +1,98 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { parse } from 'hjson'; +import { SavedObjectsClientContract } from 'src/core/server'; +import { DataSourceAttributes } from 'src/plugins/data_source/common/data_sources'; + +export interface FindDataSourceByTitleQueryProps { + dataSourceName: string; + savedObjectsClient: SavedObjectsClientContract; +} + +export const findDataSourceIdbyName = async (props: FindDataSourceByTitleQueryProps) => { + const { dataSourceName } = props; + const dataSources = await dataSourceFindQuery(props); + + // In the case that data_source_name is a prefix of another name, match exact data_source_name + const possibleDataSourceObjects = dataSources.saved_objects.filter( + (obj) => obj.attributes.title === dataSourceName + ); + + if (possibleDataSourceObjects.length !== 1) { + throw new Error( + `Expected exactly 1 result for data_source_name "${dataSourceName}" but got ${possibleDataSourceObjects.length} results` + ); + } + + return possibleDataSourceObjects.pop()?.id; +}; + +export const extractVegaSpecFromAttributes = (attributes: unknown) => { + if (isVegaVisualization(attributes)) { + // @ts-expect-error + const visStateObject = JSON.parse(attributes?.visState); + return visStateObject.params.spec; + } + + return undefined; +}; + +export const extractDataSourceNamesInVegaSpec = (spec: string) => { + const parsedSpec = parse(spec, { keepWsc: true }); + const dataField = parsedSpec.data; + const dataSourceNameSet = new Set(); + + if (dataField instanceof Array) { + dataField.forEach((dataObject) => { + const dataSourceName = getDataSourceNameFromObject(dataObject); + if (!!dataSourceName) { + dataSourceNameSet.add(dataSourceName); + } + }); + } else if (dataField instanceof Object) { + const dataSourceName = getDataSourceNameFromObject(dataField); + if (!!dataSourceName) { + dataSourceNameSet.add(dataSourceName); + } + } else { + throw new Error(`"data" field should be an object or an array of objects`); + } + + return dataSourceNameSet; +}; + +const getDataSourceNameFromObject = (dataObject: any) => { + if ( + dataObject.hasOwnProperty('url') && + dataObject.url.hasOwnProperty('index') && + dataObject.url.hasOwnProperty('data_source_name') + ) { + return dataObject.url.data_source_name; + } + + return undefined; +}; + +const isVegaVisualization = (attributes: unknown) => { + // @ts-expect-error + const visState = attributes?.visState; + if (!!visState) { + const visStateObject = JSON.parse(visState); + return !!visStateObject.type && visStateObject.type === 'vega'; + } + return false; +}; + +const dataSourceFindQuery = async (props: FindDataSourceByTitleQueryProps) => { + const { savedObjectsClient, dataSourceName } = props; + return await savedObjectsClient.find({ + type: 'data-source', + perPage: 10, + search: `"${dataSourceName}"`, + searchFields: ['title'], + fields: ['id', 'title'], + }); +}; diff --git a/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.test.ts b/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.test.ts new file mode 100644 index 000000000000..09af5459cf1d --- /dev/null +++ b/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.test.ts @@ -0,0 +1,243 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { SavedObjectsClientWrapperOptions, SavedObjectsFindOptions } from 'src/core/server'; +import { savedObjectsClientMock } from '../../../core/server/mocks'; +import { vegaVisualizationClientWrapper } from './vega_visualization_client_wrapper'; + +jest.mock('./services', () => ({ + getDataSourceEnabled: jest + .fn() + .mockReturnValueOnce({ enabled: false }) + .mockReturnValue({ enabled: true }), +})); + +describe('vegaVisualizationClientWrapper()', () => { + const loadHJSONStringFromFile = (filepath: string) => { + return readFileSync(join(__dirname, filepath)).toString(); + }; + + const getAttributesGivenSpec = (spec: string) => { + return { + title: 'Some Spec', + visState: JSON.stringify({ + title: 'Some Spec', + type: 'vega', + aggs: [], + params: { + spec, + }, + }), + }; + }; + + const client = savedObjectsClientMock.create(); + client.bulkGet = jest + .fn() + .mockImplementation((dataSourceIds: Array<{ id: string; type: string }>) => { + return Promise.resolve({ + saved_objects: dataSourceIds.map((request) => { + if (request.type === 'data-source' && request.id === 'id-a') { + return { + id: 'id-a', + attributes: { + title: 'a-title', + }, + }; + } else if (request.type === 'data-source' && request.id === 'id-b') { + return { + id: 'id-b', + attributes: { + title: 'b-title', + }, + }; + } else if (request.type === 'data-source' && request.id === 'id-z') { + return { + id: 'id-z', + attributes: { + title: 'z-title', + }, + }; + } + + return { + id: request.id, + attributes: undefined, + }; + }), + }); + }); + client.find = jest.fn().mockImplementation((query: SavedObjectsFindOptions) => { + if (query.search === `"c-title"`) { + return Promise.resolve({ + total: 1, + saved_objects: [{ id: 'id-c', attributes: { title: 'c-title' } }], + }); + } else if (query.search === `"d-title"`) { + return Promise.resolve({ + total: 1, + saved_objects: [{ id: 'id-d', attributes: { title: 'd-title' } }], + }); + } else { + return Promise.resolve({ + total: 0, + saved_objects: [], + }); + } + }); + const mockedWrapperOptions = {} as SavedObjectsClientWrapperOptions; + mockedWrapperOptions.client = client; + + beforeEach(() => { + client.create.mockClear(); + }); + + test('Should just call create as usual if MDS is disabled', async () => { + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + await wrapper.create('visualization', {}, { references: [] }); + expect(client.create).toBeCalledWith( + 'visualization', + {}, + expect.objectContaining({ references: [] }) + ); + }); + + test('Should just call create as usual if object type is not visualization type', async () => { + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + await wrapper.create('dashboard', {}, { references: [] }); + expect(client.create).toBeCalledWith( + 'dashboard', + {}, + expect.objectContaining({ references: [] }) + ); + }); + + test('Should just call create as usual if object type is not vega type', async () => { + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + // Avoids whitespacing issues by letting stringify format the string + const visState = JSON.stringify( + JSON.parse('{"type": "area", "params": {"spec": "no-spec-here"}}') + ); + await wrapper.create('visualization', { visState }, { references: [] }); + expect(client.create).toBeCalledWith( + 'visualization', + { visState }, + expect.objectContaining({ references: [] }) + ); + }); + + test('Should not update anything if the spec does not specify any data_source_name', async () => { + const spec = loadHJSONStringFromFile('/test_utils/vega_spec_with_multiple_urls.hjson'); + const attributes = getAttributesGivenSpec(spec); + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + await wrapper.create('visualization', attributes, { references: [] }); + expect(client.create).toBeCalledWith( + 'visualization', + attributes, + expect.objectContaining({ references: [] }) + ); + }); + + test('Should not update anything if the references is still up-to-date', async () => { + const spec = loadHJSONStringFromFile('/test_utils/vega_spec_up_to_date_urls_mds.hjson'); + const attributes = getAttributesGivenSpec(spec); + const references = [ + { + id: 'id-a', + type: 'data-source', + name: 'dataSource', + }, + { + id: 'id-b', + type: 'data-source', + name: 'dataSource', + }, + ]; + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + await wrapper.create('visualization', attributes, { references }); + expect(client.create).toBeCalledWith( + 'visualization', + attributes, + expect.objectContaining({ references }) + ); + }); + + test('Should throw an error if the Vega spec has invalid data_source_name field(s)', () => { + const spec = loadHJSONStringFromFile('/test_utils/vega_spec_with_multiple_urls_mds.hjson'); + const visState = { + title: 'Some Spec', + type: 'vega', + aggs: [], + params: { + spec, + }, + }; + const attributes = { + title: 'Some Spec', + visState: JSON.stringify(visState), + }; + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + expect(wrapper.create('visualization', attributes, { references: [] })).rejects.toThrowError( + `Expected exactly 1 result for data_source_name` + ); + }); + + test('Should update only the references section', async () => { + const spec = loadHJSONStringFromFile('/test_utils/vega_outdated_references_mds.hjson'); + const attributes = getAttributesGivenSpec(spec); + const commonReferences = [ + { + id: 'some-dashboard', + type: 'dashboard', + name: 'someDashboard', + }, + { + id: 'id-a', + type: 'data-source', + name: 'dataSource', + }, + { + id: 'id-b', + type: 'data-source', + name: 'dataSource', + }, + ]; + const oldReferences = [ + ...commonReferences, + { + id: 'id-z', + type: 'data-source', + name: 'dataSource', + }, + { + id: 'non-existent-id', + type: 'data-source', + name: 'dataSource', + }, + ]; + const newReferences = [ + ...commonReferences, + { + id: 'id-c', + type: 'data-source', + name: 'dataSource', + }, + { + id: 'id-d', + type: 'data-source', + name: 'dataSource', + }, + ]; + const wrapper = vegaVisualizationClientWrapper(mockedWrapperOptions); + await wrapper.create('visualization', attributes, { references: oldReferences }); + expect(client.create).toBeCalledWith( + 'visualization', + attributes, + expect.objectContaining({ references: newReferences }) + ); + }); +}); diff --git a/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.ts b/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.ts new file mode 100644 index 000000000000..4deada346c38 --- /dev/null +++ b/src/plugins/vis_type_vega/server/vega_visualization_client_wrapper.ts @@ -0,0 +1,110 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + SavedObjectsClientWrapperFactory, + SavedObjectsClientWrapperOptions, + SavedObjectsCreateOptions, + SavedObjectsErrorHelpers, +} from '../../../core/server'; +import { + extractDataSourceNamesInVegaSpec, + extractVegaSpecFromAttributes, + findDataSourceIdbyName, +} from './utils'; +import { getDataSourceEnabled } from './services'; + +export const VEGA_VISUALIZATION_CLIENT_WRAPPER_ID = 'vega-visualization-client-wrapper'; + +export const vegaVisualizationClientWrapper: SavedObjectsClientWrapperFactory = ( + wrapperOptions: SavedObjectsClientWrapperOptions +) => { + const createForVega = async ( + type: string, + attributes: T, + options?: SavedObjectsCreateOptions + ) => { + const vegaSpec = extractVegaSpecFromAttributes(attributes); + if (type !== 'visualization' || vegaSpec === undefined || !getDataSourceEnabled().enabled) { + return await wrapperOptions.client.create(type, attributes, options); + } + const dataSourceNamesSet = extractDataSourceNamesInVegaSpec(vegaSpec); + + const existingDataSourceReferences = options?.references + ?.filter((reference) => reference.type === 'data-source') + .map((dataSourceReference) => { + return { + id: dataSourceReference.id, + type: dataSourceReference.type, + }; + }); + + const existingDataSourceIdToNameMap = new Map(); + if (!!existingDataSourceReferences && existingDataSourceReferences.length > 0) { + (await wrapperOptions.client.bulkGet(existingDataSourceReferences)).saved_objects.forEach( + (object) => { + // @ts-expect-error + if (!!object.attributes && !!object.attributes.title) { + // @ts-expect-error + existingDataSourceIdToNameMap.set(object.id, object.attributes.title); + } + } + ); + } + + // Filters out outdated datasource references + const newReferences = options?.references?.filter((reference) => { + if (reference.type !== 'data-source') { + return true; + } + const dataSourceName = existingDataSourceIdToNameMap.get(reference.id); + if (dataSourceNamesSet.has(dataSourceName)) { + dataSourceNamesSet.delete(dataSourceName); + return true; + } + + return false; + }); + + for await (const dataSourceName of dataSourceNamesSet) { + const dataSourceId = await findDataSourceIdbyName({ + dataSourceName, + savedObjectsClient: wrapperOptions.client, + }); + if (dataSourceId) { + newReferences?.push({ + id: dataSourceId, + name: 'dataSource', + type: 'data-source', + }); + } else { + throw SavedObjectsErrorHelpers.createBadRequestError( + `data_source_name "${dataSourceName}" cannot be found in saved objects` + ); + } + } + + return await wrapperOptions.client.create(type, attributes, { + ...options, + references: newReferences, + }); + }; + + return { + ...wrapperOptions.client, + create: createForVega, + bulkCreate: wrapperOptions.client.bulkCreate, + checkConflicts: wrapperOptions.client.checkConflicts, + delete: wrapperOptions.client.delete, + find: wrapperOptions.client.find, + bulkGet: wrapperOptions.client.bulkGet, + get: wrapperOptions.client.get, + update: wrapperOptions.client.update, + bulkUpdate: wrapperOptions.client.bulkUpdate, + errors: wrapperOptions.client.errors, + addToNamespaces: wrapperOptions.client.addToNamespaces, + deleteFromNamespaces: wrapperOptions.client.deleteFromNamespaces, + }; +}; From e53aa5b26c8df8d5c336848902f38c6d84029bbc Mon Sep 17 00:00:00 2001 From: Manasvini B Suryanarayana Date: Wed, 20 Mar 2024 12:32:36 -0700 Subject: [PATCH 03/51] Add release notes for 2.13 (#6228) Signed-off-by: Manasvini B Suryanarayana --- release-notes/opensearch-dashboards.release-notes-2.13.0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release-notes/opensearch-dashboards.release-notes-2.13.0.md b/release-notes/opensearch-dashboards.release-notes-2.13.0.md index 5d4a30983c3b..10a2211d7ad6 100644 --- a/release-notes/opensearch-dashboards.release-notes-2.13.0.md +++ b/release-notes/opensearch-dashboards.release-notes-2.13.0.md @@ -5,6 +5,7 @@ - Support dynamic CSP rules to mitigate Clickjacking https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5641 - [CVE-2020-36604] Employ a patched version of hoek `6.1.3` ([#6148](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6148)) - [CVE-2024-27088] Bump es5-ext from `0.10.59` to `0.10.64` ([#6021](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6021)) +- [CVE-2024-28849] Bump follow-redirect from `1.15.4` to `1.15.6` ([#6199](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6201)) ### 📈 Features/Enhancements @@ -27,6 +28,7 @@ - [Multiple Datasource] Export DataSourcePluginRequestContext at top level for plugins to use ([#6108](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6108)) - [Multiple Datasource] Improves connection pooling support for AWSSigV4 clients in data sources ([#6135](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6135)) - [Multiple Datasource] Add datasource version number to newly created data source object([#6178](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6178)) +- [Multiple Datasource] Allow seting a remote data source as the default for the UI ([#6186](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6186)) - Implement new home page ([#6065](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6065)) - Add sidecar service ([#5920](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5920)) - [Dynamic Configurations] Pass request headers when making application config calls ([#6164](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6164)) From 31f2b4967a714dc85b206d487981cf9e4c629e53 Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:47:43 -0700 Subject: [PATCH 04/51] [osd/std] Add additional recovery from false-positives in handling of long numerals (#6245) (#6247) Signed-off-by: Miki (cherry picked from commit 902e216765f0ed232861a8a883e0799d30af21d6) Signed-off-by: github-actions[bot] # Conflicts: # CHANGELOG.md Co-authored-by: github-actions[bot] --- packages/osd-std/src/json.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/osd-std/src/json.ts b/packages/osd-std/src/json.ts index 3af3d3c4b96c..7387790169a3 100644 --- a/packages/osd-std/src/json.ts +++ b/packages/osd-std/src/json.ts @@ -152,7 +152,8 @@ const parseStringWithLongNumerals = ( /* There are two types of exception objects that can be raised: * 1) a textual message with the position that we need to parse * i. Unexpected [token|string ...] at position ... - * ii. expected ',' or '}' after property value in object at line ... column ... + * ii. Expected ',' or ... after ... in JSON at position ... + * iii. expected ',' or ... after ... in object at line ... column ... * 2) a proper object with lineNumber and columnNumber which we can use * Note: this might refer to the part of the code that threw the exception but * we will try it anyway; the regex is specific enough to not produce @@ -161,23 +162,24 @@ const parseStringWithLongNumerals = ( let { lineNumber, columnNumber } = e; if (typeof e?.message === 'string') { - /* Check for 1-i (seen in Node) + /* Check for 1-i and 1-ii * Finding "..."෴1111"..." inside a string value, the extra quotes throw a syntax error * and the position points to " that is assumed to be the begining of a value. */ - let match = e.message.match(/^Unexpected .*at position (\d+)(\s|$)/); + let match = e.message.match(/^(?:Une|E)xpected .*at position (\d+)(\D|$)/i); if (match) { lineNumber = 1; // Add 1 to reach the marker columnNumber = parseInt(match[1], 10) + 1; } else { - /* Check for 1-ii (seen in browsers) + /* Check for 1-iii * Finding "...,"෴1111"..." inside a string value, the extra quotes throw a syntax error * and the column number points to the marker after the " that is assumed to be terminating the * value. + * PS: There are different versions of this error across browsers and platforms. */ // ToDo: Add functional tests for this path - match = e.message.match(/expected .*at line (\d+) column (\d+)(\s|$)/); + match = e.message.match(/expected .*line (\d+) column (\d+)(\D|$)/i); if (match) { lineNumber = parseInt(match[1], 10); columnNumber = parseInt(match[2], 10); From df041478ed0d8d5c585f44dbe1a2b48e4f3d8791 Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:12:34 -0700 Subject: [PATCH 05/51] Move kristenTian to emeritus maintainer (#6208) (#6227) (cherry picked from commit 5d1dccf8a3d39b95d51ce79174327ecef8e51646) Signed-off-by: Flyingliuhub <33105471+flyingliuhub@users.noreply.github.com> Signed-off-by: github-actions[bot] Co-authored-by: github-actions[bot] --- .github/CODEOWNERS | 2 +- MAINTAINERS.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3a722b6255a8..52648656bfa1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @ananzh @kavilla @AMoo-Miki @ashwin-pc @joshuarrrr @abbyhu2000 @zengyan-amazon @kristenTian @zhongnansu @manasvinibs @ZilongX @Flyingliuhub @BSFishy @curq @bandinib-amzn @SuZhou-Joe @ruanyl @BionIT +* @ananzh @kavilla @AMoo-Miki @ashwin-pc @joshuarrrr @abbyhu2000 @zengyan-amazon @zhongnansu @manasvinibs @ZilongX @Flyingliuhub @BSFishy @curq @bandinib-amzn @SuZhou-Joe @ruanyl @BionIT diff --git a/MAINTAINERS.md b/MAINTAINERS.md index ccb2f491554e..9ba46abf4d32 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -13,7 +13,6 @@ This document contains a list of maintainers in this repo. See [opensearch-proje | Josh Romero | [joshuarrrr](https://github.com/joshuarrrr) | Amazon | | Abby Hu | [abbyhu2000](https://github.com/abbyhu2000) | Amazon | | Yan Zeng | [zengyan-amazon](https://github.com/zengyan-amazon) | Amazon | -| Kristen Tian | [kristenTian](https://github.com/kristenTian) | Amazon | | Zhongnan Su | [zhongnansu](https://github.com/zhongnansu) | Amazon | | Manasvini B Suryanarayana | [manasvinibs](https://github.com/manasvinibs) | Amazon | | Tao Liu | [Flyingliuhub](https://github.com/Flyingliuhub) | Amazon | @@ -33,3 +32,4 @@ This document contains a list of maintainers in this repo. See [opensearch-proje | Mihir Soni | [mihirsoni](https://github.com/mihirsoni) | Amazon | | Bishoy Boktor | [boktorbb](https://github.com/boktorbb) | Amazon | | Sean Neumann | [seanneumann](https://github.com/seanneumann) | Contributor | +| Kristen Tian | [kristenTian](https://github.com/kristenTian) | Amazon | From 2a9d6dd852c2931f94d292c09ed7a7ba82a43c82 Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:50:30 -0700 Subject: [PATCH 06/51] [osd/std] Add fallback mechanism when recovery from false-positives in handling of long numerals fails (#6253) (#6260) Signed-off-by: Miki (cherry picked from commit 312075c9b8b1c881fb434a7c82c58a4c34780599) Signed-off-by: github-actions[bot] # Conflicts: # CHANGELOG.md Co-authored-by: github-actions[bot] --- packages/osd-std/src/json.ts | 129 ++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 62 deletions(-) diff --git a/packages/osd-std/src/json.ts b/packages/osd-std/src/json.ts index 7387790169a3..d8bb27e1eb6a 100644 --- a/packages/osd-std/src/json.ts +++ b/packages/osd-std/src/json.ts @@ -143,77 +143,82 @@ const parseStringWithLongNumerals = ( * To find those instances, we try to parse and watch for the location of any errors. If an error * is caused by the marking, we remove that single marking and try again. */ - do { - try { - hadException = false; - obj = parseMarkedText(markedJSON); - } catch (e) { - hadException = true; - /* There are two types of exception objects that can be raised: - * 1) a textual message with the position that we need to parse - * i. Unexpected [token|string ...] at position ... - * ii. Expected ',' or ... after ... in JSON at position ... - * iii. expected ',' or ... after ... in object at line ... column ... - * 2) a proper object with lineNumber and columnNumber which we can use - * Note: this might refer to the part of the code that threw the exception but - * we will try it anyway; the regex is specific enough to not produce - * false-positives. - */ - let { lineNumber, columnNumber } = e; - - if (typeof e?.message === 'string') { - /* Check for 1-i and 1-ii - * Finding "..."෴1111"..." inside a string value, the extra quotes throw a syntax error - * and the position points to " that is assumed to be the begining of a value. + try { + do { + try { + hadException = false; + obj = parseMarkedText(markedJSON); + } catch (e) { + hadException = true; + /* There are two types of exception objects that can be raised: + * 1) a textual message with the position that we need to parse + * i. Unexpected [token|string ...] at position ... + * ii. Expected ',' or ... after ... in JSON at position ... + * iii. expected ',' or ... after ... in object at line ... column ... + * 2) a proper object with lineNumber and columnNumber which we can use + * Note: this might refer to the part of the code that threw the exception but + * we will try it anyway; the regex is specific enough to not produce + * false-positives. */ - let match = e.message.match(/^(?:Une|E)xpected .*at position (\d+)(\D|$)/i); - if (match) { - lineNumber = 1; - // Add 1 to reach the marker - columnNumber = parseInt(match[1], 10) + 1; - } else { - /* Check for 1-iii - * Finding "...,"෴1111"..." inside a string value, the extra quotes throw a syntax error - * and the column number points to the marker after the " that is assumed to be terminating the - * value. - * PS: There are different versions of this error across browsers and platforms. + let { lineNumber, columnNumber } = e; + + if (typeof e?.message === 'string') { + /* Check for 1-i and 1-ii + * Finding "..."෴1111"..." inside a string value, the extra quotes throw a syntax error + * and the position points to " that is assumed to be the begining of a value. */ - // ToDo: Add functional tests for this path - match = e.message.match(/expected .*line (\d+) column (\d+)(\D|$)/i); + let match = e.message.match(/^(?:Un)?expected .*at position (\d+)(\D|$)/i); if (match) { - lineNumber = parseInt(match[1], 10); - columnNumber = parseInt(match[2], 10); + lineNumber = 1; + // Add 1 to reach the marker + columnNumber = parseInt(match[1], 10) + 1; + } else { + /* Check for 1-iii + * Finding "...,"෴1111"..." inside a string value, the extra quotes throw a syntax error + * and the column number points to the marker after the " that is assumed to be terminating the + * value. + * PS: There are different versions of this error across browsers and platforms. + */ + // ToDo: Add functional tests for this path + match = e.message.match(/expected .*line (\d+) column (\d+)(\D|$)/i); + if (match) { + lineNumber = parseInt(match[1], 10); + columnNumber = parseInt(match[2], 10); + } } } - } - if (lineNumber < 1 || columnNumber < 2) { - /* The problem is not with this replacement. - * Note: This will never happen because the outer parse would have already thrown. - */ - // coverage:ignore-line - throw e; - } + if (lineNumber < 1 || columnNumber < 2) { + /* The problem is not with this replacement. + * Note: This will never happen because the outer parse would have already thrown. + */ + // coverage:ignore-line + throw e; + } - /* We need to skip e.lineNumber - 1 number of `\n` occurrences. - * Then, we need to go to e.columnNumber - 2 to look for `"\d+"`; we need to `-1` to - * account for the quote but an additional `-1` is needed because columnNumber starts from 1. - */ - const re = new RegExp( - `^((?:.*\\n){${lineNumber - 1}}[^\\n]{${columnNumber - 2}})"${marker}(-?\\d+)"` - ); - if (!re.test(markedJSON)) { - /* The exception is not caused by adding the marker. - * Note: This will never happen because the outer parse would have already thrown. + /* We need to skip e.lineNumber - 1 number of `\n` occurrences. + * Then, we need to go to e.columnNumber - 2 to look for `"\d+"`; we need to `-1` to + * account for the quote but an additional `-1` is needed because columnNumber starts from 1. */ - // coverage:ignore-line - throw e; - } + const re = new RegExp( + `^((?:.*\\n){${lineNumber - 1}}[^\\n]{${columnNumber - 2}})"${marker}(-?\\d+)"` + ); + if (!re.test(markedJSON)) { + /* The exception is not caused by adding the marker. + * Note: This will never happen because the outer parse would have already thrown. + */ + // coverage:ignore-line + throw e; + } - // We have found a bad replacement; let's remove it. - markedJSON = markedJSON.replace(re, '$1$2'); - } - } while (hadException); + // We have found a bad replacement; let's remove it. + markedJSON = markedJSON.replace(re, '$1$2'); + } + } while (hadException); + } catch (ex) { + // If parsing of marked `text` fails, fallback to parsing the original `text` + obj = JSON.parse(text, reviver || undefined); + } return obj; }; From ee03353ae4e2ac9d3740cbc0f0cb1c7856f1bf8b Mon Sep 17 00:00:00 2001 From: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Date: Fri, 22 Dec 2023 16:30:50 +0100 Subject: [PATCH 07/51] Compatibility with OpenSearch 2.11.1 (#131) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yenienserrano Signed-off-by: Álex Ruiz Signed-off-by: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Co-authored-by: Álex Ruiz Co-authored-by: Maximiliano Ibarra Co-authored-by: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Co-authored-by: Antonio <34042064+Desvelao@users.noreply.github.com> --- .../ISSUE_TEMPLATE/compatibility_request.md | 23 + .github/ISSUE_TEMPLATE/new_release.md | 33 + .github/workflows/build.yml | 92 +++ .../build_wazuh_dashboard_with_plugins.yml | 212 +++++ .github/workflows/codeql.yml | 77 ++ .github/workflows/cypress_workflow.yml | 10 +- .gitignore | 1 + README.md | 55 +- config/node.options.prod | 9 + config/opensearch_dashboards.prod.yml | 15 + dev-tools/build-packages/README.md | 70 ++ .../build-packages/base/generate_base.sh | 256 ++++++ dev-tools/build-packages/build-packages.sh | 191 +++++ dev-tools/build-packages/config/default | 7 + .../build-packages/config/wazuh-dashboard | 170 ++++ .../config/wazuh-dashboard.service | 15 + dev-tools/build-packages/deb/builder.sh | 51 ++ dev-tools/build-packages/deb/debian/changelog | 95 +++ dev-tools/build-packages/deb/debian/control | 12 + dev-tools/build-packages/deb/debian/copyright | 22 + dev-tools/build-packages/deb/debian/postinst | 53 ++ dev-tools/build-packages/deb/debian/postrm | 82 ++ dev-tools/build-packages/deb/debian/preinst | 73 ++ dev-tools/build-packages/deb/debian/prerm | 82 ++ dev-tools/build-packages/deb/debian/rules | 112 +++ .../deb/docker/amd64/Dockerfile | 16 + dev-tools/build-packages/deb/launcher.sh | 195 +++++ dev-tools/build-packages/rpm/builder.sh | 50 ++ .../rpm/docker/x86_64/Dockerfile | 21 + dev-tools/build-packages/rpm/launcher.sh | 198 +++++ .../build-packages/rpm/wazuh-dashboard.spec | 427 ++++++++++ dev-tools/signoff-check.sh | 2 +- docker/README.md | 75 ++ .../opensearch_dashboards.dev.security.yml | 16 + docker/config/opensearch_dashboards.dev.yml | 4 + docker/dev.sh | 44 + docker/dev.yml | 35 + docker/dev_security.yml | 85 ++ docker/get_version.sh | 15 + docs/docker-dev/docker-dev-setup-manual.md | 6 +- package.json | 8 +- .../src/__snapshots__/env.test.ts.snap | 8 + .../osd-config/src/config_service.test.ts | 6 + packages/osd-config/src/env.test.ts | 24 + packages/osd-config/src/env.ts | 4 + packages/osd-config/src/types.ts | 1 + src/cli_plugin/install/settings.js | 15 +- src/cli_plugin/install/settings.test.js | 7 +- .../__snapshots__/get_logos.test.ts.snap | 18 +- src/core/common/logos/get_logos.ts | 6 +- src/core/public/chrome/chrome_service.tsx | 4 +- src/core/public/chrome/constants.ts | 6 +- .../collapsible_nav.test.tsx.snap | 36 +- .../header/__snapshots__/header.test.tsx.snap | 94 +-- .../header_help_menu.test.tsx.snap | 36 +- .../__snapshots__/home_icon.test.tsx.snap | 12 +- .../chrome/ui/header/header_help_menu.tsx | 4 +- .../chrome/ui/header/home_icon.test.tsx | 12 +- .../public/chrome/ui/header/home_icon.tsx | 7 +- .../public/doc_links/doc_links_service.ts | 10 + .../injected_metadata_service.mock.ts | 4 + .../injected_metadata_service.ts | 19 +- src/core/public/mocks.ts | 2 + .../public/rendering/rendering_service.tsx | 8 +- .../favicons/android-chrome-192x192.png | Bin 2007 -> 6424 bytes .../favicons/android-chrome-512x512.png | Bin 5248 -> 17660 bytes .../assets/favicons/apple-touch-icon.png | Bin 1868 -> 4969 bytes .../assets/favicons/favicon-16x16.png | Bin 841 -> 1267 bytes .../assets/favicons/favicon-32x32.png | Bin 545 -> 1751 bytes .../core_app/assets/favicons/favicon.ico | Bin 15086 -> 2270 bytes .../assets/favicons/mstile-144x144.png | Bin 1836 -> 4969 bytes .../assets/favicons/mstile-150x150.png | Bin 1853 -> 14138 bytes .../assets/favicons/mstile-310x150.png | Bin 2004 -> 3411 bytes .../assets/favicons/mstile-310x310.png | Bin 3787 -> 9844 bytes .../core_app/assets/favicons/mstile-70x70.png | Bin 1331 -> 2807 bytes .../assets/favicons/safari-pinned-tab.svg | 14 +- .../core_app/assets/legacy_light_theme.css | 139 +++- .../assets/logos/opensearch_spinner.svg | 9 - .../logos/opensearch_spinner_on_dark.svg | 9 - .../logos/opensearch_spinner_on_light.svg | 9 - .../server/core_app/assets/logos/spinner.gif | Bin 0 -> 357492 bytes .../core_app/assets/logos/spinner_on_dark.gif | Bin 0 -> 313690 bytes .../assets/logos/spinner_on_light.gif | Bin 0 -> 357492 bytes .../server/core_app/assets/wazuh_login_bg.svg | 758 ++++++++++++++++++ .../server/core_app/assets/wazuh_logo.svg | 51 ++ .../__snapshots__/http_service.test.ts.snap | 2 +- src/core/server/http/http_service.ts | 6 +- src/core/server/mocks.ts | 1 + .../server/opensearch_dashboards_config.ts | 2 +- .../discovery/plugin_manifest_parser.test.ts | 1 + .../discovery/plugins_discovery.test.ts | 3 + .../integration_tests/plugins_service.test.ts | 3 + .../server/plugins/plugins_service.test.ts | 3 + .../rendering_service.test.ts.snap | 28 +- .../rendering/rendering_service.test.ts | 1 + .../server/rendering/rendering_service.tsx | 1 + src/core/server/rendering/types.ts | 1 + .../__snapshots__/template.test.tsx.snap | 36 +- src/core/server/rendering/views/styles.tsx | 17 +- .../server/rendering/views/template.test.tsx | 2 + src/core/server/rendering/views/template.tsx | 4 +- .../routes/integration_tests/status.test.ts | 1 + src/dev/build/lib/config.ts | 1 + .../build/tasks/create_package_json_task.ts | 3 + src/dev/precommit_hook/casing_check_config.js | 3 +- .../__snapshots__/call_outs.test.tsx.snap | 2 +- .../components/call_outs/call_outs.tsx | 4 +- .../dashboard_listing.test.tsx.snap | 50 +- .../dashboard_top_nav.test.tsx.snap | 60 +- src/plugins/home/opensearch_dashboards.json | 19 +- .../components/_solutions_section.scss | 2 +- .../public/application/components/home_app.js | 6 - .../legacy/__snapshots__/home.test.js.snap | 155 +--- .../application/components/legacy/home.js | 16 +- .../components/legacy/home.test.js | 15 +- .../solution_title.test.tsx.snap | 2 +- .../solutions_section/solution_title.test.tsx | 2 +- .../solutions_section/solution_title.tsx | 3 +- src/plugins/home/public/plugin.test.ts | 2 +- src/plugins/home/public/plugin.ts | 8 +- .../__snapshots__/empty_state.test.tsx.snap | 30 +- .../empty_state/empty_state.tsx | 19 - .../public/components/landing/landing.tsx | 2 +- .../common/index.ts | 2 +- .../getting_started.test.tsx.snap | 26 - .../getting_started/getting_started.tsx | 19 +- .../__snapshots__/overview.test.tsx.snap | 93 +-- .../public/components/overview/overview.tsx | 5 - .../public/plugin.ts | 12 +- .../overview_page_header.test.tsx | 8 +- .../overview_page_header.tsx | 18 - test/functional/apps/home/_sample_data.ts | 5 +- .../apps/visualize/_custom_branding.ts | 14 +- 133 files changed, 4410 insertions(+), 655 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/compatibility_request.md create mode 100644 .github/ISSUE_TEMPLATE/new_release.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/build_wazuh_dashboard_with_plugins.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 config/node.options.prod create mode 100644 config/opensearch_dashboards.prod.yml create mode 100644 dev-tools/build-packages/README.md create mode 100755 dev-tools/build-packages/base/generate_base.sh create mode 100644 dev-tools/build-packages/build-packages.sh create mode 100644 dev-tools/build-packages/config/default create mode 100644 dev-tools/build-packages/config/wazuh-dashboard create mode 100644 dev-tools/build-packages/config/wazuh-dashboard.service create mode 100755 dev-tools/build-packages/deb/builder.sh create mode 100644 dev-tools/build-packages/deb/debian/changelog create mode 100644 dev-tools/build-packages/deb/debian/control create mode 100644 dev-tools/build-packages/deb/debian/copyright create mode 100644 dev-tools/build-packages/deb/debian/postinst create mode 100644 dev-tools/build-packages/deb/debian/postrm create mode 100644 dev-tools/build-packages/deb/debian/preinst create mode 100644 dev-tools/build-packages/deb/debian/prerm create mode 100644 dev-tools/build-packages/deb/debian/rules create mode 100644 dev-tools/build-packages/deb/docker/amd64/Dockerfile create mode 100755 dev-tools/build-packages/deb/launcher.sh create mode 100755 dev-tools/build-packages/rpm/builder.sh create mode 100644 dev-tools/build-packages/rpm/docker/x86_64/Dockerfile create mode 100755 dev-tools/build-packages/rpm/launcher.sh create mode 100644 dev-tools/build-packages/rpm/wazuh-dashboard.spec create mode 100644 docker/README.md create mode 100644 docker/config/opensearch_dashboards.dev.security.yml create mode 100644 docker/config/opensearch_dashboards.dev.yml create mode 100755 docker/dev.sh create mode 100644 docker/dev.yml create mode 100755 docker/dev_security.yml create mode 100755 docker/get_version.sh delete mode 100644 src/core/server/core_app/assets/logos/opensearch_spinner.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg create mode 100644 src/core/server/core_app/assets/logos/spinner.gif create mode 100644 src/core/server/core_app/assets/logos/spinner_on_dark.gif create mode 100644 src/core/server/core_app/assets/logos/spinner_on_light.gif create mode 100644 src/core/server/core_app/assets/wazuh_login_bg.svg create mode 100644 src/core/server/core_app/assets/wazuh_logo.svg diff --git a/.github/ISSUE_TEMPLATE/compatibility_request.md b/.github/ISSUE_TEMPLATE/compatibility_request.md new file mode 100644 index 000000000000..b294b6fc8704 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/compatibility_request.md @@ -0,0 +1,23 @@ +--- +name: Compatibility request +about: Suggest supporting a new version of OpenSearch +title: 'Compatibility with OpenSearch (version)' +labels: compatibility, level/task, type/research +assignees: '' + +--- + +## Description +We need to ensure the UI compatibility with the next version of OpenSearch vX.X. +This update is still being discussed, but we need to be aware of potential issues. + +For that, we need to: + +- [ ] Review opensearch and opensearch-dashboard latest stable changelog. +- [ ] Identify improvements and potential impact on the UI. +- [ ] Create new tracking and development branches. +- [ ] Develop a testing environment to verify our components would work under this new build. + + +## Issues +- _List here the detected issues_ diff --git a/.github/ISSUE_TEMPLATE/new_release.md b/.github/ISSUE_TEMPLATE/new_release.md new file mode 100644 index 000000000000..2a8fb24f0e4d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new_release.md @@ -0,0 +1,33 @@ +--- +name: New release +about: "[wazuh-team] Track the effort of the team to release a new version of Wazuh" +title: Support for Wazuh 4.x.x +labels: level/task, type/enhancement +assignees: '' + +--- + +## Description + +Example: +> Wazuh 4.3.8 will be released shortly. Our Wazuh Dashboard app need to support this new version. From our side, no changes will be included, so we only need to bump the version. + + +## Tasks + +### Pre-release +- [ ] Add support for Wazuh 4.x.x (bump). +- [ ] Generate the required tags. +- [ ] Generate the packages. +- [ ] Test the packages, to verify they install, and the app works as expected. +- [ ] [Optional] Run Regression Testing (#issue) +- [ ] Generate draft releases. +- [ ] Notify the @wazuh/cicd and @wazuh/content teams that the release is good to go, from our side. + +### Post-release +- [ ] Make draft releases final and public. +- [ ] Sync branches. + +### Supported versions + +Same as on [previous releases](https://github.com/wazuh/wazuh-dashboard/wiki/Compatibility) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000000..8baaf0415e3c --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,92 @@ +# This is a basic workflow that is manually triggered + +name: Build + +on: + workflow_call: + inputs: + CHECKOUT_TO: # This is the branch to checkout to. Defaults to 'master' + description: 'The branch/tag/commit to checkout to' + required: true + default: '' + type: string + workflow_dispatch: + inputs: + CHECKOUT_TO: # This is the branch to checkout to. Defaults to 'master' + description: 'The branch/tag/commit to checkout to' + required: true + default: '' + +jobs: + build: + runs-on: ubuntu-latest + name: Build + defaults: + run: + working-directory: ./artifacts + strategy: + matrix: + DISTRIBUTION: [ tar.gz ] + ARCHITECTURE: [ x64 ] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + repository: wazuh/wazuh-dashboard + path: ./artifacts + ref: ${{ inputs.CHECKOUT_TO }} + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: './artifacts/.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup Yarn + run: | + npm uninstall -g yarn + npm i -g yarn@1.22.10 + yarn config set network-timeout 1000000 -g + + - name: Configure Yarn Cache + run: echo "YARN_CACHE_LOCATION=$(yarn cache dir)" >> $GITHUB_ENV + + - name: Initialize Yarn Cache + uses: actions/cache@v3 + with: + path: ${{ env.YARN_CACHE_LOCATION }} + key: yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + yarn- + + - name: Get package version + run: | + echo "VERSION=$(yarn --silent pkg-version)" >> $GITHUB_ENV + echo "WZD_VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "WZD_REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Get artifact build name + run: | + echo "ARTIFACT_BUILD_NAME=wazuh-dashboard_${{ env.WZD_VERSION }}-${{ env.WZD_REVISION }}_${{ matrix.ARCHITECTURE }}_${{ inputs.CHECKOUT_TO }}.${{ matrix.DISTRIBUTION }}" >> $GITHUB_ENV + + - name: Run bootstrap + run: yarn osd bootstrap + + - name: Build linux-x64 + if: matrix.ARCHITECTURE == 'x64' + run: yarn build-platform --linux --skip-os-packages --release + + - name: Build linux-arm64 + if: matrix.ARCHITECTURE == 'arm64' + run: yarn build-platform --linux-arm --skip-os-packages --release + + - name: Rename artifact + run: mv /home/runner/work/wazuh-dashboard/wazuh-dashboard/artifacts/target/opensearch-dashboards-${{ env.VERSION }}-linux-${{ matrix.ARCHITECTURE }}.${{ matrix.DISTRIBUTION }} /home/runner/work/wazuh-dashboard/wazuh-dashboard/artifacts/target/${{ env.ARTIFACT_BUILD_NAME }} + + - uses: actions/upload-artifact@v3 + if: success() + with: + name: ${{ env.ARTIFACT_BUILD_NAME }} + path: ./artifacts/target/${{ env.ARTIFACT_BUILD_NAME }} + retention-days: 30 diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml new file mode 100644 index 000000000000..8ab9a563409e --- /dev/null +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -0,0 +1,212 @@ +name: Build final packages + +on: + workflow_dispatch: + inputs: + REFERENCE_SECURITY_PLUGIN: + description: 'Reference Wazuh security packages (branch/tag/commit)' + required: true + default: '' + REFERENCE_WAZUH_PLUGINS: + description: 'Reference Wazuh plugins (branch/tag/commit)' + required: true + default: '' + REFERENCE_WAZUH_DASHBOARD: + description: 'Reference Wazuh dashboard (branch/tag/commit)' + required: true + default: '' + DISTRIBUTION: + description: 'Distribution to build (deb | rpm | tar | all-platforms)' + required: true + default: '' + +jobs: + build-plugins: + name: Build plugins + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@master + with: + reference: ${{ inputs.REFERENCE_WAZUH_PLUGINS }} + + build-dashboard: + name: Build dashboard + uses: wazuh/wazuh-dashboard/.github/workflows/build.yml@4.9.0 + with: + CHECKOUT_TO: ${{ inputs.REFERENCE_WAZUH_DASHBOARD }} + + build-security-plugin: + name: Build security plugin + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 + with: + reference: ${{ inputs.REFERENCE_SECURITY_PLUGIN }} + + + Build-base-package: + needs: [build-plugins, build-dashboard, build-security-plugin] + runs-on: ubuntu-latest + name: Generate final packages + strategy: + fail-fast: false + matrix: + # TODO: Add arm64 support + ARCHITECTURE: [ x64 ] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup variables + run: | + echo "CURRENT_DIR=$(pwd -P)" >> $GITHUB_ENV + echo "VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Setup packages names + run: | + echo "WAZUH_DASHBOARD_SLIM=wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_${{ matrix.ARCHITECTURE }}_${{ inputs.REFERENCE_WAZUH_DASHBOARD }}.tar.gz" >> $GITHUB_ENV + echo "WAZUH_SECURITY_PLUGIN=wazuh-security-dashboards-plugin_${{ env.VERSION }}-${{ env.REVISION }}_${{ inputs.REFERENCE_SECURITY_PLUGIN }}.zip" >> $GITHUB_ENV + echo "WAZUH_PLUGINS=wazuh-dashboard-plugins_${{ env.VERSION }}-${{ env.REVISION }}_${{ inputs.REFERENCE_WAZUH_PLUGINS }}.zip" >> $GITHUB_ENV + + - name: Download dashboard artifact + uses: actions/download-artifact@v3 + with: + name: ${{ env.WAZUH_DASHBOARD_SLIM }} + path: ${{ env.CURRENT_DIR }}/artifacts/dashboard + + - name: Download security plugin artifact + uses: actions/download-artifact@v3 + with: + name: ${{ env.WAZUH_SECURITY_PLUGIN }} + path: ${{ env.CURRENT_DIR }}/artifacts/security-plugin + + - name: Download plugins artifacts + uses: actions/download-artifact@v3 + with: + name: ${{ env.WAZUH_PLUGINS }} + path: ${{ env.CURRENT_DIR }}/artifacts/plugins + + - name: Zip plugins + run: | + zip -r -j ${{ env.CURRENT_DIR }}/artifacts/wazuh-package.zip ${{ env.CURRENT_DIR }}/artifacts/plugins + zip -r -j ${{ env.CURRENT_DIR }}/artifacts/security-package.zip ${{ env.CURRENT_DIR }}/artifacts/security-plugin + zip -r -j ${{ env.CURRENT_DIR }}/artifacts/dashboard-package.zip ${{ env.CURRENT_DIR }}/artifacts/dashboard/${{ env.WAZUH_DASHBOARD_SLIM }} + + + - name: Build packages + run: | + cd ${{ env.CURRENT_DIR }}/dev-tools/build-packages + bash ./build-packages.sh \ + -v ${{ env.VERSION }} \ + -r ${{ env.REVISION }} \ + -a file://${{env.CURRENT_DIR}}/artifacts/wazuh-package.zip \ + -s file://${{env.CURRENT_DIR}}/artifacts/security-package.zip \ + -b file://${{env.CURRENT_DIR}}/artifacts/dashboard-package.zip \ + --tar + + + - name: Upload tar packages + uses: actions/upload-artifact@v3 + with: + name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + path: ${{ env.CURRENT_DIR }}/dev-tools/build-packages/output/wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + retention-days: 30 + + build-deb-package: + needs: [Build-base-package] + if: ( contains(inputs.DISTRIBUTION, 'deb') || contains(inputs.DISTRIBUTION, 'all-platforms') ) + runs-on: ubuntu-latest + name: Build deb package + strategy: + fail-fast: false + matrix: + # TODO: Add arm64 support + ARCHITECTURE: [ x64 ] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup variables + run: | + echo "CURRENT_DIR=$(pwd -P)" >> $GITHUB_ENV + echo "VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Download dashboard artifact + uses: actions/download-artifact@v3 + with: + name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + path: ${{ env.CURRENT_DIR }}/artifacts/dashboard-tar + + - name: Build packages + run: | + cd ${{ env.CURRENT_DIR }}/dev-tools/build-packages/deb/ + bash ./launcher.sh \ + -v ${{ env.VERSION }} \ + -r ${{ env.REVISION }} \ + -p file://${{env.CURRENT_DIR}}/artifacts/dashboard-tar/wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + + - name: Upload deb packages + uses: actions/upload-artifact@v3 + if: success() + with: + name: wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_amd64.deb + path: ${{ env.CURRENT_DIR }}/dev-tools/build-packages/deb/output/wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_amd64.deb + retention-days: 30 + + + build-rpm-package: + needs: [Build-base-package] + if: ( contains(inputs.DISTRIBUTION, 'rpm') || contains(inputs.DISTRIBUTION, 'all-platforms') ) + runs-on: ubuntu-latest + name: Build rpm package + strategy: + fail-fast: false + matrix: + ARCHITECTURE: [ x64 ] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup variables + run: | + echo "CURRENT_DIR=$(pwd -P)" >> $GITHUB_ENV + echo "VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Download dashboard artifact + uses: actions/download-artifact@v3 + with: + name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + path: ${{ env.CURRENT_DIR }}/artifacts/dashboard-tar + + - name: Build packages + run: | + cd ${{ env.CURRENT_DIR }}/dev-tools/build-packages/rpm/ + bash ./launcher.sh \ + -v ${{ env.VERSION }} \ + -r ${{ env.REVISION }} \ + -p file://${{env.CURRENT_DIR}}/artifacts/dashboard-tar/wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}-linux-${{ matrix.ARCHITECTURE }}.tar.gz + + - name: Upload rpm packages + uses: actions/upload-artifact@v3 + if: success() + with: + name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm + path: ${{ env.CURRENT_DIR }}/dev-tools/build-packages/rpm/output/wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm + retention-days: 30 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000000..092c298a32e4 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,77 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "main", "[0-9].[0-9]", "[0-9].x" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "main" ] + schedule: + - cron: '00 8 * * 5' + workflow_dispatch: + +jobs: + analyze: + name: Analyze + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Use only 'java' to analyze code written in Java, Kotlin or both + # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/cypress_workflow.yml b/.github/workflows/cypress_workflow.yml index cab511ddc551..4dc7206e2ce0 100644 --- a/.github/workflows/cypress_workflow.yml +++ b/.github/workflows/cypress_workflow.yml @@ -40,6 +40,7 @@ env: COMMENT_TAG: '[MANUAL CYPRESS TEST RUN RESULTS]' COMMENT_SUCCESS_MSG: ':white_check_mark: Cypress test run succeeded!' COMMENT_FAILURE_MSG: ':x: Cypress test run failed!' + OPENSEARCH_VERSION: ${{ vars.OPENSEARCH_VERSION }} jobs: cypress-tests: @@ -106,7 +107,7 @@ jobs: with: path: ${{ env.FTR_PATH }} repository: ${{ env.TEST_REPO }} - ref: '${{ env.TEST_BRANCH }}' + ref: '${{ env.OPENSEARCH_VERSION }}' - name: Setup spec files by input if: ${{ inputs.specs != '' }} @@ -147,7 +148,7 @@ jobs: working-directory: ${{ env.FTR_PATH }} start: ${{ env.OPENSEARCH_SNAPSHOT_CMD }}, ${{ env.START_CMD }} wait-on: 'http://localhost:9200, http://localhost:5601' - command: yarn cypress:run-without-security --browser ${{ env.CYPRESS_BROWSER }} --spec ${{ env.SPEC }} + command: yarn cypress:run-without-security --browser ${{ env.CYPRESS_BROWSER }} --config ignoreTestFiles="dashboard_sanity_test_spec.js" --spec ${{ env.SPEC }} # Screenshots are only captured on failure, will change this once we do visual regression tests - uses: actions/upload-artifact@v3 @@ -156,7 +157,7 @@ jobs: name: ftr-cypress-screenshots path: ${{ env.FTR_PATH }}/cypress/screenshots retention-days: 1 - + - uses: actions/upload-artifact@v3 if: always() with: @@ -170,7 +171,6 @@ jobs: name: ftr-cypress-results path: ${{ env.FTR_PATH }}/cypress/results retention-days: 1 - add-comment: needs: [cypress-tests] if: ${{ always() && github.event_name == 'workflow_dispatch' && inputs.pr_number != '' }} @@ -205,6 +205,6 @@ jobs: '${{ env.SPEC }}' ``` - #### Link to results: + #### Link to results: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} edit-mode: replace diff --git a/.gitignore b/.gitignore index d72d66a6d17d..1add5bb6a1d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .aws-config.json .signing-config.json .ackrc +/dev-tools/build-packages/*/output /.opensearch /.chromium /package.json.bak diff --git a/README.md b/README.md index 0bd86bec6560..c4c1bf3909c2 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,41 @@ - +
+ +
- [Welcome!](#welcome) - [Project Resources](#project-resources) -- [Code of Conduct](#code-of-conduct) +- [Wazuh UI](#wazuh-ui) - [License](#license) - [Copyright](#copyright) ## Welcome -OpenSearch Dashboards is an open-source data visualization tool designed to work with OpenSearch. OpenSearch Dashboards gives you data visualization tools to improve and automate business intelligence and support data-driven decision-making and strategic planning. +Wazuh dashboard is a fork of the [OpenSearch Dashboards][opensearch-dashboards] which +incorporate changes to make it easier to use for Wazuh users. Our aim is to contribute +back any work not tied specifically to Wazuh. -We aim to be an exceptional community-driven platform and to foster open participation and collective contribution with all contributors. Stay up to date on what's happening with the OpenSearch Project by tracking GitHub [issues](https://github.com/opensearch-project/OpenSearch-Dashboards/issues) and [pull requests](https://github.com/opensearch-project/OpenSearch-Dashboards/pulls). +Wazuh is a security detection, visibility, and compliance open-source project. Wazuh +helps you to gain deeper security visibility into your infrastructure by monitoring +hosts at an operating system and application level. -You can [contribute to this project](https://github.com/opensearch-project/OpenSearch-Dashboards/issues/CONTRIBUTING.md) by [opening issues](https://github.com/opensearch-project/OpenSearch-Dashboards/issues/new/choose) to give feedback, share ideas, identify bugs, and contribute code. - -Set up your [OpenSearch Dashboards development environment](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/DEVELOPER_GUIDE.md#getting-started-guide) today! The project team looks forward to your contributions. - -## Code Summary - -[![Build and Test][build-and-test-badge]][build-and-test-link] -[![Unit Test Code Coverage][codecov-badge]][codecov-link] -[![Link Checker][link-checker-badge]][link-checker-link] +You can learn more about it at [wazuh.com][wazuh-web]. ## Project Resources -- [Project Website](https://opensearch.org/) -- [Downloads](https://opensearch.org/downloads.html) -- [Documentation](https://opensearch.org/docs/) -- Need help? See the [communication guide](COMMUNICATIONS.md) for various options -- [Project Principles](https://opensearch.org/#principles) +- [Project Website][wazuh-web] +- [Documentation][wazuh-docs] +- Need help? Joins us on [Slack][slack-invite]! - [Developer Guide](DEVELOPER_GUIDE.md) -- [Contributing to OpenSearch](CONTRIBUTING.md) +- [Contributing](CONTRIBUTING.md) - [Maintainer Responsibilities](MAINTAINERS.md) - [Release Management](RELEASING.md) - [Testing](TESTING.md) - [Security](SECURITY.md) -## Code of Conduct +## Wazuh UI -This project has adopted the [Amazon Open Source Code of Conduct](CODE_OF_CONDUCT.md). For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq), or contact [opensource-codeofconduct@amazon.com](mailto:opensource-codeofconduct@amazon.com) with any additional questions or comments. +This repository is not a new Wazuh UI, but the platform on which Wazuh UI will run. +The UI can be found on its own [repository][wazuh-plugin]. ## License @@ -46,11 +43,13 @@ This project is licensed under the [Apache v2.0 License](LICENSE.txt). ## Copyright -Copyright OpenSearch Contributors. See [NOTICE](NOTICE.txt) for details. +- Copyright OpenSearch Contributors. See [NOTICE](NOTICE.txt) for details. +- Copyright Wazuh, Inc. + + -[build-and-test-badge]: https://github.com/opensearch-project/OpenSearch-Dashboards/actions/workflows/build_and_test_workflow.yml/badge.svg -[build-and-test-link]: https://github.com/opensearch-project/OpenSearch-Dashboards/actions/workflows/build_and_test_workflow.yml -[codecov-badge]: https://codecov.io/gh/opensearch-project/OpenSearch-Dashboards/branch/main/graphs/badge.svg -[codecov-link]: https://app.codecov.io/gh/opensearch-project/OpenSearch-Dashboards -[link-checker-badge]: https://github.com/opensearch-project/OpenSearch-Dashboards/actions/workflows/links_checker.yml/badge.svg -[link-checker-link]: https://github.com/opensearch-project/OpenSearch-Dashboards/actions/workflows/links_checker.yml +[opensearch-dashboards]: https://github.com/opensearch-project/OpenSearch-Dashboards +[wazuh-plugin]: https://github.com/wazuh/wazuh-kibana-app +[wazuh-web]: https://wazuh.com +[wazuh-docs]: https://documentation.wazuh.com +[slack-invite]: https://join.slack.com/t/wazuh/shared_invite/zt-1lgu531ur-7M_k_ZQbpdo4QCn_pHee3w diff --git a/config/node.options.prod b/config/node.options.prod new file mode 100644 index 000000000000..ed533b559152 --- /dev/null +++ b/config/node.options.prod @@ -0,0 +1,9 @@ +## Node command line options +## See `node --help` and `node --v8-options` for available options +## Please note you should specify one option per line + +## max size of old space in megabytes +#--max-old-space-size=4096 + +## Wazuh - do not terminate process on unhandled promise rejection +--unhandled-rejections=warn diff --git a/config/opensearch_dashboards.prod.yml b/config/opensearch_dashboards.prod.yml new file mode 100644 index 000000000000..89b23a8be11e --- /dev/null +++ b/config/opensearch_dashboards.prod.yml @@ -0,0 +1,15 @@ +server.host: 0.0.0.0 +server.port: 443 +opensearch.hosts: https://localhost:9200 +opensearch.ssl.verificationMode: certificate +opensearch.requestHeadersAllowlist: ["securitytenant","Authorization"] +opensearch_security.multitenancy.enabled: false +opensearch_security.readonly_mode.roles: ["kibana_read_only"] +server.ssl.enabled: true +server.ssl.key: "/etc/wazuh-dashboard/certs/dashboard-key.pem" +server.ssl.certificate: "/etc/wazuh-dashboard/certs/dashboard.pem" +opensearch.ssl.certificateAuthorities: ["/etc/wazuh-dashboard/certs/root-ca.pem"] +uiSettings.overrides.defaultRoute: /app/wz-home + +opensearchDashboards.branding: + useExpandedHeader: false diff --git a/dev-tools/build-packages/README.md b/dev-tools/build-packages/README.md new file mode 100644 index 000000000000..16f085dde78f --- /dev/null +++ b/dev-tools/build-packages/README.md @@ -0,0 +1,70 @@ +# Package building +This folder contains tools used to create `rpm` and `deb` packages. + +## Requirements + - A system with Docker. + - Internet connection (to download the docker images the first time). + +## Builders + +### Tarball + +To system packages (deb and rpm), a tarball of Wazuh dashboard `.tar.gz` is required. +This tarball contains the [Wazuh plugin][wazuh-plugin], the [Wazuh Security plugin][wazuh-security-plugin], +a set of OpenSearch plugins and the default configuration for the app. + +The `generate_base.sh` script generates a `.tar.gz` file using the following inputs: +- `-a` | `--app`: URL to the zipped Wazuh plugin.* +- `-b` | `--base`: URL to the Wazuh dashboard `.tar.gz`, as generated with `yarn build --skip-os-packages --release`.* +- `-s` | `--security`: URL to the zipped Wazuh Security plugin, as generated with `yarn build`.* +- `-v` | `--version`: the Wazuh version of the package. +- `-r` | `--revision`: [Optional] Set the revision of the build. By default, it is set to 1. +- `-o` | `--output` [Optional] Set the destination path of package. By default, an output folder will be created in the same directory as the script. + +*Note:* use `file://` to indicate a local file. Otherwise, the script will try to download the file from the given URL. + +Example: +```bash +bash generate_base.sh \ + --app https://packages-dev.wazuh.com/pre-release/ui/dashboard/wazuh-4.6.0-1.zip \ + --base file:///home/user/wazuh-dashboard/target/opensearch-dashboards-2.4.1-linux-x64.tar.gz \ + --security file:///home/user/wazuh-security-dashboards-plugin/build/security-dashboards-2.4.1.0.zip \ + --version 4.6.0 +``` + +### DEB + +The `launcher.sh` script generates a `.deb` package based on the previously generated `.tar.gz`. +A Docker container is used to generate the package. It takes the following inputs: +- `-v` | `--version`: the Wazuh version of the package. +- `-p` | `--package`: the location of the `.tar.gz` file. It can be a URL or a PATH, with the format `file://` +- `-r` | `--revision`: [Optional] Set the revision of the build. By default, it is set to 1. +- `-o` | `--output` [Optional] Set the destination path of package. By default, an output folder will be created in the same directory as the script. +- `--dont-build-docker`: [Optional] Locally built Docker image will be used instead of generating a new one. + +Example: +```bash +bash launcher.sh \ + --version 4.6.0 \ + --package file:///home/user/wazuh-dashboard/dev_tools/build_packages/base/output/wazuh-dashboard-4.6.0-1-linux-x64.tar.gz +``` + +### RPM + +The `launcher.sh` script generates a `.rpm` package based on the previously generated `.tar.gz`. +A Docker container is used to generate the package. It takes the following inputs: +- `-v` | `--version`: the Wazuh version of the package. +- `-p` | `--package`: the location of the `.tar.gz` file. It can be a URL or a PATH, with the format `file://` +- `-r` | `--revision`: [Optional] Set the revision of the build. By default, it is set to 1. +- `-o` | `--output` [Optional] Set the destination path of package. By default, an output folder will be created in the same directory as the script. +- `--dont-build-docker`: [Optional] Locally built Docker image will be used instead of generating a new one. + +Example: +```bash +bash launcher.sh \ + --version 4.6.0 \ + --package file:///home/user/wazuh-dashboard/dev_tools/build_packages/base/output/wazuh-dashboard-4.6.0-1-linux-x64.tar.gz +``` + +[wazuh-plugin]: https://github.com/wazuh/wazuh-kibana-app +[wazuh-security-plugin]: https://github.com/wazuh/wazuh-security-dashboards-plugin \ No newline at end of file diff --git a/dev-tools/build-packages/base/generate_base.sh b/dev-tools/build-packages/base/generate_base.sh new file mode 100755 index 000000000000..ad80a08c6c4b --- /dev/null +++ b/dev-tools/build-packages/base/generate_base.sh @@ -0,0 +1,256 @@ +#!/bin/bash + +# Wazuh package generator +# Copyright (C) 2022, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +# Inputs +app="" +base="" +revision="1" +security="" +version="" + +# Paths +current_path="$( cd $(dirname $0) ; pwd -P )" +config_path=$(realpath $current_path/../../../config) + +# Folders +out_dir="${current_path}/output" +tmp_dir="${current_path}/tmp" + +trap ctrl_c INT + +clean() { + exit_code=$1 + echo + echo "Cleaning temporary files..." + echo + # Clean the files + rm -r $tmp_dir + + if [ $exit_code != 0 ]; then + rm $out_dir/*.tar.gz + rmdir $out_dir + fi + + exit ${exit_code} +} + +ctrl_c() { + clean 1 +} + +# ----------------------------------------------------------------------------- + +build() { + # Validate and download files to build the package + valid_url='(https?|ftp|file)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]' + echo + echo "Downloading plugins..." + echo + mkdir -p $tmp_dir + cd $tmp_dir + mkdir -p applications + mkdir -p dashboards + if [[ $app =~ $valid_url ]]; then + if ! curl --output applications/app.zip --silent --fail "${app}"; then + echo "The given URL or Path to the Wazuh Apps is not working: ${app}" + clean 1 + else + echo "Extracting applications from app.zip" + unzip -q applications/app.zip -d applications + rm applications/app.zip + fi + else + echo "The given URL or Path to the Wazuh App is not valid: ${app}" + clean 1 + fi + + echo + echo "Downloading dashboards..." + echo + + if [[ $base =~ $valid_url ]]; then + if [[ $base =~ .*\.zip ]]; then + if ! curl --output wazuh-dashboard.zip --silent --fail "${base}"; then + echo "The given URL or Path to the Wazuh Dashboard base is not working: ${base}" + clean 1 + else + echo "Extracting Wazuh Dashboard base" + unzip -q wazuh-dashboard.zip -d ./dashboards/ + rm wazuh-dashboard.zip + mv ./dashboards/$(ls ./dashboards) wazuh-dashboard.tar.gz + fi + else + if ! curl --output wazuh-dashboard.tar.gz --silent --fail "${base}"; then + echo "The given URL or Path to the Wazuh Dashboard base is not working: ${base}" + clean 1 + fi + fi + else + echo "The given URL or Path to the Wazuh Dashboard base is not valid: ${base}" + clean 1 + fi + + echo + echo "Downloading security plugin..." + echo + + if [[ $security =~ $valid_url ]]; then + if ! curl --output applications/security.zip --silent --fail "${security}"; then + echo "The given URL or Path to the Wazuh Security Plugin is not working: ${security}" + clean 1 + else + echo "Extracting Security application" + unzip -q applications/security.zip -d applications + rm applications/security.zip + fi + else + echo "The given URL or Path to the Wazuh Security Plugin is not valid: ${security}" + clean 1 + fi + + tar -zxf wazuh-dashboard.tar.gz + directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) + working_dir="wazuh-dashboard-$version-$revision-linux-x64" + mv $directory_name $working_dir + cd $working_dir + + echo + echo Building the package... + echo + + # Install plugins + bin/opensearch-dashboards-plugin install alertingDashboards + bin/opensearch-dashboards-plugin install customImportMapDashboards + bin/opensearch-dashboards-plugin install ganttChartDashboards + bin/opensearch-dashboards-plugin install indexManagementDashboards + bin/opensearch-dashboards-plugin install notificationsDashboards + bin/opensearch-dashboards-plugin install reportsDashboards + # Install Wazuh apps and Security app + plugins=$(ls $tmp_dir/applications) + echo $plugins + for plugin in $plugins; do + echo $plugin + if [[ $plugin =~ .*\.zip ]]; then + bin/opensearch-dashboards-plugin install file:../applications/$plugin + fi + done + + # Enable the default configuration (renaming) + cp $config_path/opensearch_dashboards.prod.yml config/opensearch_dashboards.yml + cp $config_path/node.options.prod config/node.options + + # TODO: investigate to remove this if possible + # Fix ambiguous shebangs (necessary for RPM building) + grep -rnwl './node_modules/' -e '#!/usr/bin/env python$' | xargs -I {} sed -i 's/#!\/usr\/bin\/env python/#!\/usr\/bin\/env python3/g' {} + grep -rnwl './node_modules/' -e '#!/usr/bin/python$' | xargs -I {} sed -i 's/#!\/usr\/bin\/python/#!\/usr\/bin\/python3/g' {} + + # Compress + echo + echo Compressing the package... + echo + cd .. + if [ ! -d "$out_dir" ]; then + mkdir -p $out_dir + fi + tar -czf $out_dir/$working_dir.tar.gz $working_dir + + echo + echo DONE! + echo + clean 0 +} + +# ----------------------------------------------------------------------------- + +help() { + echo + echo "Usage: $0 [OPTIONS]" + echo " -a, --app Set the location of the .zip file containing the Wazuh plugin." + echo " -b, --base Set the location of the .tar.gz file containing the base wazuh-dashboard build." + echo " -s, --security Set the location of the .zip file containing the wazuh-security-dashboards-plugin." + echo " -v, --version Set the version of this build." + echo " -r, --revision [Optional] Set the revision of this build. By default, it is set to 1." + echo " -o, --output [Optional] Set the destination path of package. By default, an output folder will be created." + echo " -h, --help Show this help." + echo + exit $1 +} + +# ----------------------------------------------------------------------------- + +main() { + while [ -n "${1}" ]; do + case "${1}" in + "-h" | "--help") + help 0 + ;; + "-a" | "--app") + if [ -n "$2" ]; then + app="$2" + shift 2 + else + help 1 + fi + ;; + "-s" | "--security") + if [ -n "${2}" ]; then + security="${2}" + shift 2 + else + help 0 + fi + ;; + "-b" | "--base") + if [ -n "${2}" ]; then + base="${2}" + shift 2 + else + help 0 + fi + ;; + "-v" | "--version") + if [ -n "${2}" ]; then + version="${2}" + shift 2 + else + help 0 + fi + ;; + "-r" | "--revision") + if [ -n "${2}" ]; then + revision="${2}" + shift 2 + fi + ;; + "-o" | "--output") + if [ -n "${2}" ]; then + output="${2}" + shift 2 + fi + ;; + *) + + help 1 + ;; + esac + done + + if [ -z "$app" ] | [ -z "$base" ] | [ -z "$security" ] | [ -z "$version" ]; then + help 1 + fi + + build || exit 1 + + exit 0 +} + +main "$@" diff --git a/dev-tools/build-packages/build-packages.sh b/dev-tools/build-packages/build-packages.sh new file mode 100644 index 000000000000..9a9b4053ab53 --- /dev/null +++ b/dev-tools/build-packages/build-packages.sh @@ -0,0 +1,191 @@ +#!/bin/bash + +app="" +base="" +revision="1" +security="" +version="" +all_platforms="no" +deb="no" +rpm="no" +tar="no" +output="$( cd $(dirname $0) ; pwd -P )/output" + +current_path="$( cd $(dirname $0) ; pwd -P )" + +build_tar() { + echo "Building tar package..." + cd ./base + bash ./generate_base.sh -a $app -b $base -s $security -v $version -r $revision + + name_package_tar=$(ls ./output) + + echo "Moving tar package to $output" + mv $current_path/base/output/$name_package_tar $output/$name_package_tar + cd ../ +} + +build_deb() { + echo "Building deb package..." + name_package_tar=$(find $output -name "*.tar.gz") + cd ./deb + bash ./launcher.sh -v $version -r $revision -p file://$name_package_tar + name_package_tar=$(ls ./output) + echo "Moving deb package to $output/deb" + mv $current_path/deb/output $output/deb + cd ../ +} + +build_rpm() { + echo "Building rpm package..." + name_package_tar=$(find $output -name "*.tar.gz") + cd ./rpm + bash ./launcher.sh -v $version -r $revision -p file://$name_package_tar + echo "Moving rpm package to $output/rpm" + mv $current_path/rpm/output $output/rpm + cd ../ +} + + +build() { + name_package_tar="wazuh-dashboard-$version-$revision-linux-x64.tar.gz" + + if [ ! -d "$output" ]; then + mkdir $output + fi + + if [ "$all_platforms" == "yes" ]; then + deb="yes" + rpm="yes" + tar="yes" + fi + + build_tar + cd $current_path + + if [ $deb == "yes" ]; then + echo "Building deb package..." + build_deb + fi + + if [ $rpm == "yes" ]; then + echo "Building rpm package..." + build_rpm + fi + + if [ "$tar" == "no" ]; then + echo "Removing tar package..." + rm -r $(find $output -name "*.tar.gz") + fi +} + +help() { + echo + echo "Usage: $0 [OPTIONS]" + echo " -a, --app Set the location of the .zip file containing the Wazuh plugin." + echo " -b, --base Set the location of the .tar.gz file containing the base wazuh-dashboard build." + echo " -s, --security Set the location of the .zip file containing the wazuh-security-dashboards-plugin." + echo " -v, --version Set the version of this build." + echo " --all-platforms Build for all platforms." + echo " --deb Build for deb." + echo " --rpm Build for rpm." + echo " --tar Build for tar." + echo " -r, --revision [Optional] Set the revision of this build. By default, it is set to 1." + echo " -o, --output [Optional] Set the destination path of package. By default, an output folder will be created." + echo " -h, --help Show this help." + echo + exit $1 +} + +# ----------------------------------------------------------------------------- + +main() { + while [ -n "${1}" ]; do + case "${1}" in + "-h" | "--help") + help 0 + ;; + "-a" | "--app") + if [ -n "$2" ]; then + app="$2" + shift 2 + else + help 1 + fi + ;; + "-s" | "--security") + if [ -n "${2}" ]; then + security="${2}" + shift 2 + else + help 0 + fi + ;; + "-b" | "--base") + if [ -n "${2}" ]; then + base="${2}" + shift 2 + else + help 0 + fi + ;; + "-v" | "--version") + if [ -n "${2}" ]; then + version="${2}" + shift 2 + else + help 0 + fi + ;; + "-r" | "--revision") + if [ -n "${2}" ]; then + revision="${2}" + shift 2 + fi + ;; + "--all-platforms") + all_platforms="yes" + shift 1 + ;; + "--deb") + deb="yes" + shift 1 + ;; + "--rpm") + rpm="yes" + shift 1 + ;; + "--tar") + tar="yes" + shift 1 + ;; + "-o" | "--output") + if [ -n "${2}" ]; then + output="${2}" + shift 2 + fi + ;; + *) + echo "help" + + help 1 + ;; + esac + done + + if [ -z "$app" ] | [ -z "$base" ] | [ -z "$security" ] | [ -z "$version" ]; then + echo "You must specify the app, base, security and version." + help 1 + fi + + if [ "$all_platforms" == "no" ] && [ "$deb" == "no" ] && [ "$rpm" == "no" ] && [ "$tar" == "no" ]; then + echo "You must specify at least one package to build." + help 1 + fi + + build || exit 1 + + exit 0 +} + +main "$@" diff --git a/dev-tools/build-packages/config/default b/dev-tools/build-packages/config/default new file mode 100644 index 000000000000..c4f94fd36814 --- /dev/null +++ b/dev-tools/build-packages/config/default @@ -0,0 +1,7 @@ +user="wazuh-dashboard" +group="wazuh-dashboard" +chroot="/" +chdir="/" +nice="" +KILL_ON_STOP_TIMEOUT=0 + diff --git a/dev-tools/build-packages/config/wazuh-dashboard b/dev-tools/build-packages/config/wazuh-dashboard new file mode 100644 index 000000000000..ae87055c3a9d --- /dev/null +++ b/dev-tools/build-packages/config/wazuh-dashboard @@ -0,0 +1,170 @@ +#!/bin/sh +# chkconfig: 2345 95 20 +# description: Wazuh dashboard +# +# Source function libraries if present. +# (It improves integration with systemd) +# +# Red Hat +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions + +# Debian +elif [ -f /lib/lsb/init-functions ]; then + . /lib/lsb/init-functions + +# SUSE +elif [ -f /etc/rc.status ]; then + . /etc/rc.status + rc_reset +fi + +name=wazuh-dashboard +program=/usr/share/wazuh-dashboard/bin/opensearch-dashboards +args=-c\\\ /etc/wazuh-dashboard/opensearch_dashboards.yml +PID_DIR="/run/wazuh-dashboard" +pidfile="$PID_DIR/$name.pid" + +[ -r /etc/default/$name ] && . /etc/default/$name +[ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name + +export NODE_OPTIONS + +[ -z "$nice" ] && nice=0 + +trace() { + logger -t "/etc/init.d/wazuh-dashboard" "$@" +} + +emit() { + trace "$@" + echo "$@" +} + +start() { + + + # Setup any environmental stuff beforehand + + # Ensure that the PID_DIR exists (it is cleaned at OS startup time) + if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then + mkdir -p "$PID_DIR" && chown "$user":"$group" "$PID_DIR" + fi + if [ -n "$pidfile" ] && [ ! -e "$pidfile" ]; then + touch "$pidfile" && chown "$user":"$group" "$pidfile" + fi + + + # Run the program! + + chroot --userspec "$user":"$group" "$chroot" sh -c "cd \"$chdir\";exec \"$program\" $args" & + + + + # Generate the pidfile from here. If we instead made the forked process + # generate it there will be a race condition between the pidfile writing + # and a process possibly asking for status. + echo $! > $pidfile + + emit "$name started" + return 0 +} + +stop() { + # Try a few times to kill TERM the program + if status ; then + pid=$(cat "$pidfile") + trace "Killing $name (pid $pid) with SIGTERM" + kill -TERM $pid + # Wait for it to exit. + for i in 1 2 3 4 5 ; do + trace "Waiting $name (pid $pid) to die..." + status || break + sleep 1 + done + if status ; then + if [ "$KILL_ON_STOP_TIMEOUT" -eq 1 ] ; then + trace "Timeout reached. Killing $name (pid $pid) with SIGKILL. This may result in data loss." + kill -KILL $pid + emit "$name killed with SIGKILL." + else + emit "$name stop failed; still running." + fi + else + emit "$name stopped." + fi + fi +} + +status() { + if [ -f "$pidfile" ] ; then + pid=$(cat "$pidfile") + if ps -p $pid > /dev/null 2> /dev/null ; then + # process by this pid is running. + # It may not be our pid, but that's what you get with just pidfiles. + # TODO(sissel): Check if this process seems to be the same as the one we + # expect. It'd be nice to use flock here, but flock uses fork, not exec, + # so it makes it quite awkward to use in this case. + return 0 + else + return 2 # program is dead but pid file exists + fi + else + return 3 # program is not running + fi +} + +force_stop() { + if status ; then + stop + status && kill -KILL $(cat "$pidfile") + fi +} + + +case "$1" in + force-start|start|stop|force-stop|restart) + trace "Attempting '$1' on wazuh-dashboard" + ;; +esac + +case "$1" in + force-start) + PRESTART=no + exec "$0" start + ;; + start) + status + code=$? + if [ $code -eq 0 ]; then + emit "$name is already running" + exit $code + else + start + exit $? + fi + ;; + stop) stop ;; + force-stop) force_stop ;; + status) + status + code=$? + if [ $code -eq 0 ] ; then + emit "$name is running" + else + emit "$name is not running" + fi + exit $code + ;; + restart) + + stop && start + ;; + *) + echo "Usage: $SCRIPTNAME {start|force-start|stop|force-start|force-stop|status|restart}" >&2 + exit 3 + ;; +esac + +exit $? + diff --git a/dev-tools/build-packages/config/wazuh-dashboard.service b/dev-tools/build-packages/config/wazuh-dashboard.service new file mode 100644 index 000000000000..3fd27c5a1ab9 --- /dev/null +++ b/dev-tools/build-packages/config/wazuh-dashboard.service @@ -0,0 +1,15 @@ +[Unit] +Description=wazuh-dashboard + +[Service] +Type=simple +User=wazuh-dashboard +Group=wazuh-dashboard +EnvironmentFile=-/etc/default/wazuh-dashboard +EnvironmentFile=-/etc/sysconfig/wazuh-dashboard +ExecStart=/usr/share/wazuh-dashboard/bin/opensearch-dashboards "-c /etc/wazuh-dashboard/opensearch_dashboards.yml" +WorkingDirectory=/usr/share/wazuh-dashboard + +[Install] +WantedBy=multi-user.target + diff --git a/dev-tools/build-packages/deb/builder.sh b/dev-tools/build-packages/deb/builder.sh new file mode 100755 index 000000000000..681623489fa9 --- /dev/null +++ b/dev-tools/build-packages/deb/builder.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Wazuh package builder +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +# Script parameters to build the package +target="wazuh-dashboard" +architecture=$1 +revision=$2 +version=$3 +directory_base="/usr/share/wazuh-dashboard" + +# Build directories +build_dir=/build +pkg_name="${target}-${version}" +pkg_path="${build_dir}/${target}" +source_dir="${pkg_path}/${pkg_name}" +deb_file="${target}_${version}-${revision}_${architecture}.deb" + +mkdir -p ${source_dir}/debian + +# Including spec file +cp -r /root/build-packages/deb/debian/* ${source_dir}/debian/ + +# Generating directory structure to build the .deb package +cd ${build_dir}/${target} && tar -czf ${pkg_name}.orig.tar.gz "${pkg_name}" + +# Configure the package with the different parameters +sed -i "s:VERSION:${version}:g" ${source_dir}/debian/changelog +sed -i "s:RELEASE:${revision}:g" ${source_dir}/debian/changelog +sed -i "s:export INSTALLATION_DIR=.*:export INSTALLATION_DIR=${directory_base}:g" ${source_dir}/debian/rules + +# Installing build dependencies +cd ${source_dir} +mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y" + +# Build package +debuild --no-lintian -b -uc -us \ + -eINSTALLATION_DIR="${directory_base}" \ + -eVERSION="${version}" \ + -eREVISION="${revision}" + +cd ${pkg_path} && sha512sum ${deb_file} >/tmp/${deb_file}.sha512 +mv ${pkg_path}/${deb_file} /tmp/ diff --git a/dev-tools/build-packages/deb/debian/changelog b/dev-tools/build-packages/deb/debian/changelog new file mode 100644 index 000000000000..3a5ac0f89eb2 --- /dev/null +++ b/dev-tools/build-packages/deb/debian/changelog @@ -0,0 +1,95 @@ +wazuh-dashboard (VERSION-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Fri, 05 May 2023 12:31:50 +0000 + +wazuh-dashboard (4.4.2-RELEASE) stable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 24 Apr 2023 12:31:50 +0000 + +wazuh-dashboard (4.4.1-RELEASE) stable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 17 Apr 2023 12:31:50 +0000 + +wazuh-dashboard (4.4.0-RELEASE) stable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Wed, 18 Jan 2023 12:31:50 +0000 + +wazuh-dashboard (4.3.10-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Thu, 10 Nov 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.9-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 03 Oct 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.8-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 19 Sep 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.7-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 08 Aug 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.6-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Thu, 07 Jul 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.5-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Wed, 29 Jun 2022 15:00:00 +0000 + +wazuh-dashboard (4.3.4-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Tue, 07 Jun 2022 15:41:39 +0000 + +wazuh-dashboard (4.3.3-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Tue, 31 May 2022 15:41:39 +0000 + +wazuh-dashboard (4.3.2-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 30 May 2022 15:41:39 +0000 + +wazuh-dashboard (4.3.1-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Wed, 18 May 2022 12:14:41 +0000 + +wazuh-dashboard (4.3.0-RELEASE) unstable; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Thu, 05 May 2022 12:15:57 +0000 + +wazuh-dashboard (4.2.5-1) UNRELEASED; urgency=low + + * More info: https://documentation.wazuh.com/current/release-notes/ + + -- Wazuh, Inc Mon, 15 Nov 2021 16:47:07 +0000 diff --git a/dev-tools/build-packages/deb/debian/control b/dev-tools/build-packages/deb/debian/control new file mode 100644 index 000000000000..5f35b4f6e601 --- /dev/null +++ b/dev-tools/build-packages/deb/debian/control @@ -0,0 +1,12 @@ +Source: wazuh-dashboard +Section: admin +Priority: extra +Maintainer: Wazuh, Inc +Build-Depends: debhelper-compat (= 12) +Standards-Version: 4.5.0 +Homepage: https://www.wazuh.com + +Package: wazuh-dashboard +Architecture: any +Depends: debconf, adduser, curl, tar, libcap2-bin +Description: Wazuh dashboard is a user interface and visualization tool for security-related data. This Wazuh central component enables exploring, visualizing, and analyzing the stored security alerts generated by the Wazuh server. Wazuh dashboard enables inspecting the status and managing the configurations of the Wazuh cluster and agents as well as creating and managing users and roles. In addition, it allows testing the ruleset and making calls to the Wazuh API. Documentation can be found at https://documentation.wazuh.com/current/getting-started/components/wazuh-dashboard.html diff --git a/dev-tools/build-packages/deb/debian/copyright b/dev-tools/build-packages/deb/debian/copyright new file mode 100644 index 000000000000..d2003bbbead7 --- /dev/null +++ b/dev-tools/build-packages/deb/debian/copyright @@ -0,0 +1,22 @@ +This work was packaged for Debian by: + + Wazuh, Inc on Sat, 04 Dec 2021 14:04:26 +0000 + +It was downloaded from: + + https://www.wazuh.com + +Copyright: + + GNU General Public License version 2. + +License: + + GNU General Public License version 2. + +The Debian packaging is: + + Copyright (C) 2021 Wazuh, Inc + +and is licensed under the GPL version 2, +see "/usr/share/common-licenses/GPL-2". \ No newline at end of file diff --git a/dev-tools/build-packages/deb/debian/postinst b/dev-tools/build-packages/deb/debian/postinst new file mode 100644 index 000000000000..232c1d0316ce --- /dev/null +++ b/dev-tools/build-packages/deb/debian/postinst @@ -0,0 +1,53 @@ +#!/bin/sh +# postinst script for wazuh-dashboard +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +export NAME=wazuh-dashboard +export CONFIG_DIR=/etc/"${NAME}" +export INSTALLATION_DIR=/usr/share/"${NAME}" +export PID_DIR=/run/"${NAME}" + +# Setting Owner and group of own folders +mkdir -p "${PID_DIR}" +chown -R "${NAME}":"${NAME}" "${PID_DIR}" + +case "$1" in +configure) + chmod 750 "${TARGET_DIR}""${CONFIG_DIR}" + chown -R "${NAME}":"${NAME}" "${TARGET_DIR}""${CONFIG_DIR}" + chmod 750 "${TARGET_DIR}""${INSTALLATION_DIR}" + chown -R "${NAME}":"${NAME}" "${TARGET_DIR}""${INSTALLATION_DIR}" + setcap 'cap_net_bind_service=+ep' "${INSTALLATION_DIR}"/node/bin/node + if [ -f "${INSTALLATION_DIR}"/"${NAME}".restart ]; then + rm -f "${INSTALLATION_DIR}"/"${NAME}".restart + if command -v systemctl >/dev/null 2>&1 && systemctl >/dev/null 2>&1; then + systemctl daemon-reload >/dev/null 2>&1 + systemctl restart wazuh-dashboard.service >/dev/null 2>&1 + elif command -v service >/dev/null 2>&1 && service wazuh-dashboard status 2>/dev/null | grep "running" >/dev/null 2>&1; then + service wazuh-dashboard restart >/dev/null 2>&1 + fi + fi + if [ ! -f "${INSTALLATION_DIR}"/config/opensearch_dashboards.keystore ]; then + runuser "${NAME}" --shell="/bin/bash" --command="${INSTALLATION_DIR}/bin/opensearch-dashboards-keystore create" >/dev/null 2>&1 + runuser "${NAME}" --shell="/bin/bash" --command="echo kibanaserver | ${INSTALLATION_DIR}/bin/opensearch-dashboards-keystore add opensearch.username --stdin" >/dev/null 2>&1 + runuser "${NAME}" --shell="/bin/bash" --command="echo kibanaserver | ${INSTALLATION_DIR}/bin/opensearch-dashboards-keystore add opensearch.password --stdin" >/dev/null 2>&1 + fi + ;; + +abort-upgrade | abort-remove | abort-deconfigure) ;; + +*) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; + +esac + +exit 0 diff --git a/dev-tools/build-packages/deb/debian/postrm b/dev-tools/build-packages/deb/debian/postrm new file mode 100644 index 000000000000..a5b88616434f --- /dev/null +++ b/dev-tools/build-packages/deb/debian/postrm @@ -0,0 +1,82 @@ +#!/bin/sh +# postinst script for wazuh-dashboard +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +export NAME=wazuh-dashboard +export CONFIG_DIR=/etc/"${NAME}" +export INSTALLATION_DIR=/usr/share/"${NAME}" +export PID_DIR=/run/${NAME} + +# +# This script is executed in the post-removal phase +# +# On Debian, +# $1=remove : indicates a removal +# $1=purge : indicates an upgrade + +# source the default env file +if [ -f "/etc/default/${NAME}" ]; then + . "/etc/default/${NAME}" +fi + +REMOVE_DIRS=false +REMOVE_CONFIG_DIRECTORY=false +REMOVE_USER_AND_GROUP=false + +case "$1" in +remove) + REMOVE_DIRS=true + ;; + +purge) + REMOVE_DIRS=true + REMOVE_CONFIG_DIRECTORY=true + REMOVE_USER_AND_GROUP=true + ;; +failed-upgrade | abort-install | upgrade | abort-upgrade | disappear) ;; + +*) + + echo "post remove script called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +if [ "$REMOVE_DIRS" = "true" ]; then + + if [ -d ${PID_DIR} ]; then + echo -n "Deleting PID directory..." + rm -rf ${PID_DIR} >/dev/null 2>&1 + echo " OK" + fi + + if [ -d "${INSTALLATION_DIR}" ]; then + echo -n "Deleting installation directory..." + rm -rf "${INSTALLATION_DIR}" + echo " OK" + fi + + # Delete the config directory if we are purging + if [ "$REMOVE_CONFIG_DIRECTORY" = "true" ]; then + rm -rf "${CONFIG_DIR}" + echo " OK" + fi + +fi + +if [ "$REMOVE_USER_AND_GROUP" = "true" ]; then + if id "${NAME}" >/dev/null 2>&1; then + userdel "${NAME}" + fi + + if getent group "${NAME}" >/dev/null 2>&1; then + groupdel "${NAME}" + fi +fi diff --git a/dev-tools/build-packages/deb/debian/preinst b/dev-tools/build-packages/deb/debian/preinst new file mode 100644 index 000000000000..1d955fd8dc1c --- /dev/null +++ b/dev-tools/build-packages/deb/debian/preinst @@ -0,0 +1,73 @@ +#!/bin/sh +# postinst script for wazuh-dashboard +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +# +# This script is executed in the pre-installation phase +# +# On Debian, +# $1=install : indicates an new install +# $1=upgrade : indicates an upgrade + +# configuration variables +export NAME=wazuh-dashboard +export CONFIG_DIR=/etc/"${NAME}" +export INSTALLATION_DIR=/usr/share/"${NAME}" + +case "$1" in +# Debian #################################################### +install) + # environment configuration + mkdir -p "${CONFIG_DIR}" + mkdir -p "${INSTALLATION_DIR}" + + # Create wazuh-dashboard group if not existing + if ! getent group "${NAME}" >/dev/null 2>&1; then + echo -n "Creating ${NAME} group..." + addgroup --quiet --system "${NAME}" + echo " OK" + fi + # Create wazuh-dashboard user if not existing + if ! id "${NAME}" >/dev/null 2>&1; then + echo -n "Creating ${NAME} user..." + adduser --quiet \ + --system \ + --no-create-home \ + --home /nonexistent \ + --ingroup "${NAME}" \ + --disabled-password \ + --shell /bin/false \ + "${NAME}" + echo " OK" + fi + + ;; +upgrade) + # Stop the services to upgrade the package + if command -v systemctl >/dev/null 2>&1 && systemctl >/dev/null 2>&1 && systemctl is-active --quiet "${NAME}" >/dev/null 2>&1; then + systemctl stop "${NAME}".service >/dev/null 2>&1 + touch "${INSTALLATION_DIR}"/"${NAME}".restart + # Check for SysV + elif command -v service >/dev/null 2>&1 && service "${NAME}" status 2>/dev/null | grep "running" >/dev/null 2>&1; then + service "${NAME}" stop >/dev/null 2>&1 + touch "${INSTALLATION_DIR}"/"${NAME}".restart + fi + ;; +abort-deconfigure | abort-upgrade | abort-remove) ;; + +*) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + + ;; + +esac + +exit 0 diff --git a/dev-tools/build-packages/deb/debian/prerm b/dev-tools/build-packages/deb/debian/prerm new file mode 100644 index 000000000000..eef54075a11b --- /dev/null +++ b/dev-tools/build-packages/deb/debian/prerm @@ -0,0 +1,82 @@ +#!/bin/sh +# postinst script for wazuh-dashboard +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +export NAME=wazuh-dashboard +export CONFIG_DIR=/etc/"${NAME}" +export INSTALLATION_DIR=/usr/share/"${NAME}" + +# +# This script is executed in the pre-remove phase +# +# On Debian, +# $1=remove : indicates a removal +# $1=upgrade : indicates an upgrade + +# source the default env file +if [ -f "/etc/default/${NAME}" ]; then + . "/etc/default/${NAME}" +fi + +STOP_REQUIRED=false +REMOVE_SERVICE=false + +case "$1" in + +# Debian #################################################### +remove) + STOP_REQUIRED=true + REMOVE_SERVICE=true + ;; +upgrade | deconfigure | failed-upgrade) ;; + +*) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; + +esac + +# Stops the service +if [ "$STOP_REQUIRED" = "true" ]; then + echo -n "Stopping wazuh-dashboard service..." + if command -v systemctl >/dev/null; then + systemctl --no-reload stop "${NAME}".service + + elif [ -x /etc/init.d/"${NAME}" ]; then + if command -v invoke-rc.d >/dev/null; then + invoke-rc.d "${NAME}" stop + else + /etc/init.d/"${NAME}" stop + fi + + # older suse linux distributions do not ship with systemd + # but do not have an /etc/init.d/ directory + # this tries to start the wazuh-dashboard service on these + # as well without failing this script + elif [ -x /etc/rc.d/init.d/"${NAME}" ]; then + /etc/rc.d/init.d/"${NAME}" stop + fi + echo " OK" +fi + +if [ "$REMOVE_SERVICE" = "true" ]; then + if command -v systemctl >/dev/null; then + systemctl disable "${NAME}".service >/dev/null 2>&1 || true + fi + + if command -v chkconfig >/dev/null; then + chkconfig --del "${NAME}" 2>/dev/null || true + fi + + if command -v update-rc.d >/dev/null; then + update-rc.d "${NAME}" remove >/dev/null || true + fi +fi diff --git a/dev-tools/build-packages/deb/debian/rules b/dev-tools/build-packages/deb/debian/rules new file mode 100644 index 000000000000..98638dab5602 --- /dev/null +++ b/dev-tools/build-packages/deb/debian/rules @@ -0,0 +1,112 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 +# +# Modified by Wazuh +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +export TARGET_DIR=${CURDIR}/debian/wazuh-dashboard +export NAME=wazuh-dashboard +export CONFIG_DIR=/etc/$(NAME) +export INSTALLATION_DIR=$(INSTALLATION_DIR) +export USER=$(NAME) +export GROUP=$(NAME) +export DASHBOARD_FILE=wazuh-dashboard.tar.gz + +# ----------------------------------------------------------------------------- + +%: + dh $@ + +# ----------------------------------------------------------------------------- + +override_dh_shlibdeps: + +# ----------------------------------------------------------------------------- + +override_dh_auto_configure: + +# ----------------------------------------------------------------------------- + +override_dh_auto_install: + +# ----------------------------------------------------------------------------- + +override_dh_install: + cp /opt/$(DASHBOARD_FILE) ./ + + groupadd $(GROUP) + useradd -g $(GROUP) $(USER) + + tar -xf $(DASHBOARD_FILE) + + mkdir -p $(TARGET_DIR)$(CONFIG_DIR) + mkdir -p $(TARGET_DIR)$(INSTALLATION_DIR) + mkdir -p $(TARGET_DIR)/etc/systemd/system + mkdir -p $(TARGET_DIR)/etc/default + + cp wazuh-dashboard-base/config/node.options $(TARGET_DIR)$(CONFIG_DIR) + cp wazuh-dashboard-base/config/opensearch_dashboards.yml $(TARGET_DIR)$(CONFIG_DIR) + mv wazuh-dashboard-base/* $(TARGET_DIR)$(INSTALLATION_DIR) + + mkdir -p $(TARGET_DIR)$(INSTALLATION_DIR)/config + + cp $(TARGET_DIR)$(INSTALLATION_DIR)/wazuh-dashboard.service $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard.service + cp $(TARGET_DIR)$(INSTALLATION_DIR)/wazuh-dashboard $(TARGET_DIR)/etc/systemd/system/$(NAME) + cp $(TARGET_DIR)$(INSTALLATION_DIR)/default $(TARGET_DIR)/etc/default/$(NAME) + + rm -rf $(TARGET_DIR)$(INSTALLATION_DIR)/etc + + chown -R $(USER):$(GROUP) $(TARGET_DIR)$(INSTALLATION_DIR) + chown -R $(USER):$(GROUP) $(TARGET_DIR)$(CONFIG_DIR) + + find $(TARGET_DIR)$(INSTALLATION_DIR)/plugins/wazuh/ -exec chown $(USER):$(GROUP) {} \; + +# ----------------------------------------------------------------------------- + +override_dh_fixperms: + chmod 750 $(TARGET_DIR)$(CONFIG_DIR) + chown -R $(USER):$(GROUP) $(TARGET_DIR)$(CONFIG_DIR) + chmod 750 $(TARGET_DIR)$(INSTALLATION_DIR) + chown -R $(USER):$(GROUP) $(TARGET_DIR)$(INSTALLATION_DIR) + chown root:root $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard.service + chown root:root $(TARGET_DIR)/etc/systemd/system/"$(NAME)" + chown $(USER):$(GROUP) $(TARGET_DIR)/etc/default/"$(NAME)" + chown $(USER):$(GROUP) $(TARGET_DIR)$(INSTALLATION_DIR)/VERSION + chmod 440 $(TARGET_DIR)$(INSTALLATION_DIR)/VERSION + chmod 750 $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard + chmod 750 $(TARGET_DIR)/etc/default/wazuh-dashboard + chmod 640 "$(TARGET_DIR)$(CONFIG_DIR)"/node.options + chmod 640 $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard.service + find "$(TARGET_DIR)$(INSTALLATION_DIR)" -type d -exec chmod 750 {} \; + find "$(TARGET_DIR)$(INSTALLATION_DIR)" -type f -perm 644 -exec chmod 640 {} \; + find "$(TARGET_DIR)$(INSTALLATION_DIR)" -type f -perm 755 -exec chmod 750 {} \; + find "$(TARGET_DIR)$(INSTALLATION_DIR)" -type f -perm 744 -exec chmod 740 {} \; + +# ----------------------------------------------------------------------------- + +override_dh_strip: + dh_strip --no-automatic-dbgsym -XlibGLESv2.so -XlibEGL.so + +# ----------------------------------------------------------------------------- + +.PHONY: override_dh_strip override_dh_auto_clean override_dh_auto_build override_dh_auto_configure diff --git a/dev-tools/build-packages/deb/docker/amd64/Dockerfile b/dev-tools/build-packages/deb/docker/amd64/Dockerfile new file mode 100644 index 000000000000..f3ca3b981113 --- /dev/null +++ b/dev-tools/build-packages/deb/docker/amd64/Dockerfile @@ -0,0 +1,16 @@ +FROM debian:10 + +ENV DEBIAN_FRONTEND noninteractive + +# Installing necessary packages +RUN apt-get update && apt-get install -y --allow-change-held-packages apt-utils && \ + apt-get install -y --allow-change-held-packages \ + curl sudo wget expect gnupg build-essential \ + devscripts equivs selinux-basics procps gawk + +# Add the script to build the Debian package +ADD builder.sh /usr/local/bin/builder +RUN chmod +x /usr/local/bin/builder + +# Set the entrypoint +ENTRYPOINT ["/usr/local/bin/builder"] \ No newline at end of file diff --git a/dev-tools/build-packages/deb/launcher.sh b/dev-tools/build-packages/deb/launcher.sh new file mode 100755 index 000000000000..090bcb96a71b --- /dev/null +++ b/dev-tools/build-packages/deb/launcher.sh @@ -0,0 +1,195 @@ +#!/bin/bash + +# Wazuh package generator +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +# Inputs +package="" +version="" +revision="1" +architecture="amd64" +build_base="yes" +build_docker="yes" + +# Constants +deb_amd64_builder="deb_dashboard_builder_amd64" +deb_builder_dockerfile="${current_path}/docker" + +# Paths +current_path="$( cd $(dirname $0) ; pwd -P )" +config_path=$(realpath $current_path/../config) + +# Folders +out_dir="${current_path}/output" +tmp_dir="${current_path}/tmp" + +trap ctrl_c INT + +clean() { + exit_code=$1 + echo + echo "Cleaning temporary files..." + echo + # Clean the files + rm -r $tmp_dir + rm $current_path/docker/amd64/*.sh + if [ $exit_code != 0 ]; then + rm $out_dir/* + rmdir $out_dir + fi + + exit ${exit_code} +} + +ctrl_c() { + clean 1 +} + +build_deb() { + container_name="$1" + dockerfile_path="$2" + + # Validate and download files to build the package + valid_url='(https?|ftp|file)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]' + + echo + echo "Downloading files..." + echo + + mkdir -p $tmp_dir + cd $tmp_dir + + if [[ $package =~ $valid_url ]]; then + if ! curl --output wazuh-dashboard.tar.gz --silent --fail "${package}"; then + echo "The given URL or Path to the Wazuh Dashboard package is not working: ${package}" + clean 1 + fi + else + echo "The given URL or Path to the Wazuh Dashboard package is not valid: ${package}" + clean 1 + fi + + echo + echo Building the package... + echo + + # Prepare the package + directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) + tar -zxf wazuh-dashboard.tar.gz + rm wazuh-dashboard.tar.gz + mv $directory_name wazuh-dashboard-base + cp $config_path/* wazuh-dashboard-base + echo ${version} >wazuh-dashboard-base/VERSION + tar -czf ./wazuh-dashboard.tar.gz wazuh-dashboard-base + + # Copy the necessary files + cp ${current_path}/builder.sh ${dockerfile_path} + + # Build the Docker image + if [[ ${build_docker} == "yes" ]]; then + docker build -t ${container_name} ${dockerfile_path} || return 1 + fi + + # Build the Debian package with a Docker container + if [ ! -d "$out_dir" ]; then + mkdir -p $out_dir + fi + volumes="-v ${out_dir}/:/tmp:Z -v ${tmp_dir}/wazuh-dashboard.tar.gz:/opt/wazuh-dashboard.tar.gz" + docker run -t --rm ${volumes} \ + -v ${current_path}/../..:/root:Z \ + ${container_name} ${architecture} \ + ${revision} ${version} || return 1 + + echo "Package $(ls -Art ${out_dir} | tail -n 1) added to ${out_dir}." + + echo + echo DONE! + echo + + return 0 +} + +build() { + build_name="${deb_amd64_builder}" + file_path="../${deb_builder_dockerfile}/${architecture}" + build_deb ${build_name} ${file_path} || return 1 + return 0 +} + +help() { + echo + echo "Usage: $0 [OPTIONS]" + echo + echo " -v, --version Wazuh version" + echo " -p, --package Set the location of the .tar.gz file containing the Wazuh Dashboard package." + echo " -r, --revision [Optional] Package revision. By default: 1." + echo " -o, --output [Optional] Set the destination path of package. By default, an output folder will be created." + echo " --dont-build-docker [Optional] Locally built Docker image will be used instead of generating a new one." + echo " -h, --help Show this help." + echo + exit $1 +} + +main() { + while [ -n "${1}" ]; do + case "${1}" in + "-h" | "--help") + help 0 + ;; + "-p" | "--package") + if [ -n "${2}" ]; then + package="${2}" + shift 2 + else + help 1 + fi + ;; + "-v" | "--version") + if [ -n "${2}" ]; then + version="${2}" + shift 2 + else + help 1 + fi + ;; + "-r" | "--revision") + if [ -n "${2}" ]; then + revision="${2}" + shift 2 + else + help 1 + fi + ;; + "--dont-build-docker") + build_docker="no" + shift 1 + ;; + "-o" | "--output") + if [ -n "${2}" ]; then + out_dir="${2}" + shift 2 + else + help 1 + fi + ;; + *) + help 1 + ;; + esac + done + + if [ -z "$package" ] | [ -z "$version" ]; then + help 1 + fi + + build || clean 1 + + clean 0 +} + +main "$@" diff --git a/dev-tools/build-packages/rpm/builder.sh b/dev-tools/build-packages/rpm/builder.sh new file mode 100755 index 000000000000..f71f9476d038 --- /dev/null +++ b/dev-tools/build-packages/rpm/builder.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Wazuh package builder +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +set -e + +# Script parameters to build the package +target="wazuh-dashboard" +architecture=$1 +revision=$2 +version=$3 +directory_base="/usr/share/wazuh-dashboard" + +# Build directories +build_dir=/build +rpm_build_dir=${build_dir}/rpmbuild +pkg_name=${target}-${version} +pkg_path="${rpm_build_dir}/RPMS/${architecture}" +file_name="${target}-${version}-${revision}" +rpm_file="${file_name}.${architecture}.rpm" + +mkdir -p ${rpm_build_dir}/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} + +# Prepare the sources directory to build the source tar.gz +mkdir ${build_dir}/${pkg_name} + +# Including spec file +cp /root/build-packages/rpm/${target}.spec ${rpm_build_dir}/SPECS/${pkg_name}.spec + +# Generating source tar.gz +cd ${build_dir} && tar czf "${rpm_build_dir}/SOURCES/${pkg_name}.tar.gz" "${pkg_name}" + +# Building RPM +/usr/bin/rpmbuild -v \ + --define "_topdir ${rpm_build_dir}" \ + --define "_version ${version}" \ + --define "_release ${revision}" \ + --define "_localstatedir ${directory_base}" \ + --target ${architecture} \ + -ba ${rpm_build_dir}/SPECS/${pkg_name}.spec + +cd ${pkg_path} && sha512sum ${rpm_file} >/tmp/${rpm_file}.sha512 + +find ${pkg_path}/ -maxdepth 3 -type f -name "${file_name}*" -exec mv {} /tmp/ \; diff --git a/dev-tools/build-packages/rpm/docker/x86_64/Dockerfile b/dev-tools/build-packages/rpm/docker/x86_64/Dockerfile new file mode 100644 index 000000000000..eb6493d15878 --- /dev/null +++ b/dev-tools/build-packages/rpm/docker/x86_64/Dockerfile @@ -0,0 +1,21 @@ +FROM rockylinux:8.5 + +# Install all the necessary tools to build the packages +RUN yum clean all && yum update -y +RUN yum install -y openssh-clients sudo gnupg \ + yum-utils epel-release redhat-rpm-config rpm-devel \ + zlib zlib-devel rpm-build autoconf automake \ + glibc-devel libtool perl + +#RUN yum install -y --nobest https://repo.ius.io/ius-release-el7.rpm + +RUN yum update -y && yum install -y python3 + +RUN ln -fs /usr/bin/python3.6 /usr/bin/python + +# Add the scripts to build the RPM package +ADD builder.sh /usr/local/bin/builder +RUN chmod +x /usr/local/bin/builder + +# Set the entrypoint +ENTRYPOINT ["/usr/local/bin/builder"] diff --git a/dev-tools/build-packages/rpm/launcher.sh b/dev-tools/build-packages/rpm/launcher.sh new file mode 100755 index 000000000000..ca9a67d4c1c4 --- /dev/null +++ b/dev-tools/build-packages/rpm/launcher.sh @@ -0,0 +1,198 @@ +#!/bin/bash + +# Wazuh package generator +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. + +# Inputs +package="" +version="" +revision="1" +architecture="x86_64" +build_base="yes" +build_docker="yes" + +# Constants +rpm_x86_builder="rpm_dashboard_builder_x86" +rpm_builder_dockerfile="${current_path}/docker" + +# Paths +current_path="$( cd $(dirname $0) ; pwd -P )" +config_path=$(realpath $current_path/../config) + +# Folders +out_dir="${current_path}/output" +tmp_dir="${current_path}/tmp" + +trap ctrl_c INT + +clean() { + exit_code=$1 + echo + echo "Cleaning temporary files..." + echo + # Clean the files + rm -r $tmp_dir + rm $current_path/docker/x86_64/*.sh + + if [ $exit_code != 0 ]; then + rm $out_dir/* + rmdir $out_dir + fi + + exit ${exit_code} +} + +ctrl_c() { + clean 1 +} + +build_rpm() { + container_name="$1" + dockerfile_path="$2" + + # Validate and download files to build the package + valid_url='(https?|ftp|file)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]' + + echo + echo "Downloading files..." + echo + + mkdir -p $tmp_dir + cd $tmp_dir + + if [[ $package =~ $valid_url ]]; then + if ! curl --output wazuh-dashboard.tar.gz --silent --fail "${package}"; then + echo "The given URL or Path to the Wazuh Dashboard package is not working: ${package}" + clean 1 + fi + else + echo "The given URL or Path to the Wazuh Dashboard package is not valid: ${package}" + clean 1 + fi + + echo + echo Building the package... + echo + + # Prepare the package + directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) + tar -zxf wazuh-dashboard.tar.gz + rm wazuh-dashboard.tar.gz + mv $directory_name wazuh-dashboard-base + mkdir -p wazuh-dashboard-base/etc/services + cp $config_path/* wazuh-dashboard-base/etc/services + echo ${version} >wazuh-dashboard-base/VERSION + tar -czf ./wazuh-dashboard.tar.gz wazuh-dashboard-base + + # Copy the necessary files + cp ${current_path}/builder.sh ${dockerfile_path} + + # Build the Docker image + if [[ ${build_docker} == "yes" ]]; then + docker build -t ${container_name} ${dockerfile_path} || return 1 + fi + + # Build the RPM package with a Docker container + + if [ ! -d "$out_dir" ]; then + mkdir -p $out_dir + fi + volumes="-v ${out_dir}/:/tmp:Z -v ${tmp_dir}/wazuh-dashboard.tar.gz:/opt/wazuh-dashboard.tar.gz" + docker run -t --rm ${volumes} \ + -v ${current_path}/../..:/root:Z \ + ${container_name} ${architecture} \ + ${revision} ${version} || return 1 + + echo "Package $(ls -Art ${out_dir} | tail -n 1) added to ${out_dir}." + + echo + echo DONE! + echo + + return 0 +} + +build() { + build_name="${rpm_x86_builder}" + file_path="../${rpm_builder_dockerfile}/${architecture}" + build_rpm ${build_name} ${file_path} || return 1 + return 0 +} + +help() { + echo + echo "Usage: $0 [OPTIONS]" + echo + echo " -v, --version Wazuh version" + echo " -p, --package Set the location of the .tar.gz file containing the Wazuh Dashboard package." + echo " -r, --revision [Optional] Package revision. By default: 1." + echo " -o, --output [Optional] Set the destination path of package. By default, an output folder will be created." + echo " --dont-build-docker [Optional] Locally built Docker image will be used instead of generating a new one." + echo " -h, --help Show this help." + echo + exit $1 +} + +main() { + while [ -n "${1}" ]; do + case "${1}" in + "-h" | "--help") + help 0 + ;; + "-p" | "--package") + if [ -n "${2}" ]; then + package="${2}" + shift 2 + else + help 1 + fi + ;; + "-v" | "--version") + if [ -n "${2}" ]; then + version="${2}" + shift 2 + else + help 1 + fi + ;; + "-r" | "--revision") + if [ -n "${2}" ]; then + revision="${2}" + shift 2 + else + help 1 + fi + ;; + "--dont-build-docker") + build_docker="no" + shift 1 + ;; + "-o" | "--output") + if [ -n "${2}" ]; then + outdir="${2}" + shift 2 + else + help 1 + fi + ;; + *) + help 1 + ;; + esac + done + + if [ -z "$package" ] | [ -z "$version" ]; then + help 1 + fi + + build || clean 1 + + clean 0 +} + +main "$@" diff --git a/dev-tools/build-packages/rpm/wazuh-dashboard.spec b/dev-tools/build-packages/rpm/wazuh-dashboard.spec new file mode 100644 index 000000000000..39e5c924d453 --- /dev/null +++ b/dev-tools/build-packages/rpm/wazuh-dashboard.spec @@ -0,0 +1,427 @@ +# Wazuh dashboard SPEC +# Copyright (C) 2021, Wazuh Inc. +# +# This program is a free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License (version 2) as published by the FSF - Free Software +# Foundation. +Summary: Wazuh dashboard is a user interface and visualization tool for security-related data. Documentation can be found at https://documentation.wazuh.com/current/getting-started/components/wazuh-dashboard.html +Name: wazuh-dashboard +Version: %{_version} +Release: %{_release} +License: GPL +Group: System Environment/Daemons +Source0: %{name}-%{version}.tar.gz +URL: https://www.wazuh.com/ +buildroot: %{_tmppath}/%{name}-%{version}-%{release}-wazuh-dashboard-%(%{__id_u} -n) +Vendor: Wazuh, Inc +Packager: Wazuh, Inc +Requires(pre): /usr/sbin/groupadd /usr/sbin/useradd +Requires(preun): /sbin/service +Requires(postun): /sbin/service +AutoReqProv: no +Requires: libcap +ExclusiveOS: linux + +# ----------------------------------------------------------------------------- + +%global USER %{name} +%global GROUP %{name} +%global CONFIG_DIR /etc/%{name} +%global PID_DIR /run/%{name} +%global INSTALL_DIR /usr/share/%{name} +%global DASHBOARD_FILE wazuh-dashboard.tar.gz +%define _source_payload w9.gzdio +%define _binary_payload w9.gzdio + +# ----------------------------------------------------------------------------- + + +%description +Wazuh dashboard is a user interface and visualization tool for security-related data. This Wazuh central component enables exploring, visualizing, and analyzing the stored security alerts generated by the Wazuh server. Wazuh dashboard enables inspecting the status and managing the configurations of the Wazuh cluster and agents as well as creating and managing users and roles. In addition, it allows testing the ruleset and making calls to the Wazuh API. Documentation can be found at https://documentation.wazuh.com/current/getting-started/components/wazuh-dashboard.html + +# ----------------------------------------------------------------------------- + +%prep + +cp /opt/%{DASHBOARD_FILE} ./ + +groupadd %{GROUP} +useradd -g %{GROUP} %{USER} + +# ----------------------------------------------------------------------------- + +%build + +tar -xf %{DASHBOARD_FILE} + +# ----------------------------------------------------------------------------- + +%install + +mkdir -p %{buildroot}%{CONFIG_DIR} +mkdir -p %{buildroot}%{INSTALL_DIR} +mkdir -p %{buildroot}/etc/systemd/system +mkdir -p %{buildroot}%{_initrddir} +mkdir -p %{buildroot}/etc/default + +cp wazuh-dashboard-base/config/node.options %{buildroot}%{CONFIG_DIR} +cp wazuh-dashboard-base/config/opensearch_dashboards.yml %{buildroot}%{CONFIG_DIR} +cp wazuh-dashboard-base/VERSION %{buildroot}%{INSTALL_DIR} + +mv wazuh-dashboard-base/* %{buildroot}%{INSTALL_DIR} + +# Set custom welcome styles + +mkdir -p %{buildroot}%{INSTALL_DIR}/config + +cp %{buildroot}%{INSTALL_DIR}/etc/services/wazuh-dashboard.service %{buildroot}/etc/systemd/system/wazuh-dashboard.service +cp %{buildroot}%{INSTALL_DIR}/etc/services/default %{buildroot}/etc/default/wazuh-dashboard + +chmod 640 %{buildroot}/etc/systemd/system/wazuh-dashboard.service +chmod 640 %{buildroot}/etc/default/wazuh-dashboard + +rm -rf %{buildroot}%{INSTALL_DIR}/etc/ + +find %{buildroot}%{INSTALL_DIR} -exec chown %{USER}:%{GROUP} {} \; +find %{buildroot}%{CONFIG_DIR} -exec chown %{USER}:%{GROUP} {} \; + +chown root:root %{buildroot}/etc/systemd/system/wazuh-dashboard.service + +find %{buildroot}%{INSTALL_DIR}/plugins/wazuh/ -exec chown %{USER}:%{GROUP} {} \; +find %{buildroot}%{INSTALL_DIR}/plugins/wazuh/ -type f -perm 644 -exec chmod 640 {} \; +find %{buildroot}%{INSTALL_DIR}/plugins/wazuh/ -type f -perm 755 -exec chmod 750 {} \; +find %{buildroot}%{INSTALL_DIR}/plugins/wazuh/ -type d -exec chmod 750 {} \; +find %{buildroot}%{INSTALL_DIR}/plugins/wazuh/ -type f -perm 744 -exec chmod 740 {} \; + +# ----------------------------------------------------------------------------- + +%pre +# Create the wazuh-dashboard group if it doesn't exists +if [ $1 = 1 ]; then + if command -v getent > /dev/null 2>&1 && ! getent group %{GROUP} > /dev/null 2>&1; then + groupadd -r %{GROUP} + elif ! getent group %{GROUP} > /dev/null 2>&1; then + groupadd -r %{GROUP} + fi + # Create the wazuh-dashboard user if it doesn't exists + if ! getent passwd %{USER} > /dev/null 2>&1; then + useradd -g %{GROUP} -G %{USER} -d %{INSTALL_DIR}/ -r -s /sbin/nologin wazuh-dashboard + fi +fi +# Stop the services to upgrade the package +if [ $1 = 2 ]; then + if command -v systemctl > /dev/null 2>&1 && systemctl > /dev/null 2>&1 && systemctl is-active --quiet wazuh-dashboard > /dev/null 2>&1; then + systemctl stop wazuh-dashboard.service > /dev/null 2>&1 + touch %{INSTALL_DIR}/wazuh-dashboard.restart + # Check for SysV + elif command -v service > /dev/null 2>&1 && service wazuh-dashboard status 2>/dev/null | grep "is running" > /dev/null 2>&1; then + service wazuh-dashboard stop > /dev/null 2>&1 + touch %{INSTALL_DIR}/wazuh-dashboard.restart + fi +fi + +# ----------------------------------------------------------------------------- + +%post +setcap 'cap_net_bind_service=+ep' %{INSTALL_DIR}/node/bin/node + +if [ ! -f %{INSTALLATION_DIR}/config/opensearch_dashboards.keystore ]; then + runuser %{USER} --shell="/bin/bash" --command="%{INSTALL_DIR}/bin/opensearch-dashboards-keystore create" > /dev/null 2>&1 + runuser %{USER} --shell="/bin/bash" --command="echo kibanaserver | %{INSTALL_DIR}/bin/opensearch-dashboards-keystore add opensearch.username --stdin" > /dev/null 2>&1 + runuser %{USER} --shell="/bin/bash" --command="echo kibanaserver | %{INSTALL_DIR}/bin/opensearch-dashboards-keystore add opensearch.password --stdin" > /dev/null 2>&1 +fi + +# ----------------------------------------------------------------------------- + +%preun +if [ $1 = 0 ];then # Remove + echo -n "Stopping wazuh-dashboard service..." + if command -v systemctl > /dev/null 2>&1 && systemctl > /dev/null 2>&1; then + systemctl stop wazuh-dashboard.service > /dev/null 2>&1 + # Check for SysV + elif command -v service > /dev/null 2>&1; then + service wazuh-dashboard stop > /dev/null 2>&1 + fi +fi + +# ----------------------------------------------------------------------------- + +%postun +if [ $1 = 0 ];then + # If the package is been uninstalled + # Remove the wazuh-dashboard user if it exists + if getent passwd %{USER} > /dev/null 2>&1; then + userdel %{USER} >/dev/null 2>&1 + fi + # Remove the wazuh-dashboard group if it exists + if command -v getent > /dev/null 2>&1 && getent group %{GROUP} > /dev/null 2>&1; then + groupdel %{GROUP} >/dev/null 2>&1 + elif getent group %{GROUP} > /dev/null 2>&1; then + groupdel %{GROUP} >/dev/null 2>&1 + fi + + # Remove /etc/wazuh-dashboard and /usr/share/wazuh-dashboard dirs + rm -rf %{INSTALL_DIR} + if [ -d %{PID_DIR} ]; then + rm -rf %{PID_DIR} + fi +fi + +# ----------------------------------------------------------------------------- + +# posttrans code is the last thing executed in a install/upgrade +%posttrans +if [ ! -d %{PID_DIR} ]; then + mkdir -p %{PID_DIR} + chown %{USER}:%{GROUP} %{PID_DIR} +fi + +if [ -f %{INSTALL_DIR}/wazuh-dashboard.restart ]; then + rm -f %{INSTALL_DIR}/wazuh-dashboard.restart + if command -v systemctl > /dev/null 2>&1 && systemctl > /dev/null 2>&1; then + systemctl restart wazuh-dashboard.service > /dev/null 2>&1 + # Check for SysV + elif command -v service > /dev/null 2>&1; then + service wazuh-dashboard restart > /dev/null 2>&1 + fi + +fi + + +# ----------------------------------------------------------------------------- + +%clean +rm -fr %{buildroot} + +# ----------------------------------------------------------------------------- + +%files +%defattr(-,%{USER},%{GROUP}) +%dir %attr(750, %{USER}, %{GROUP}) %{CONFIG_DIR} + +%attr(0750, %{USER}, %{GROUP}) "/etc/default/wazuh-dashboard" +%config(noreplace) %attr(0640, %{USER}, %{GROUP}) "%{CONFIG_DIR}/opensearch_dashboards.yml" +%config(noreplace) %attr(0640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/config/opensearch_dashboards.yml" +%config(noreplace) %attr(0640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/config/node.options" + +%attr(440, %{USER}, %{GROUP}) %{INSTALL_DIR}/VERSION +%dir %attr(750, %{USER}, %{GROUP}) %{INSTALL_DIR} +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/core" +%attr(-, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/core/*" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/remove" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/list" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/lib" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/downloaders" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/utils" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/root" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/harden" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/__fixtures__" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/__fixtures__/plugin" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/__fixtures__/plugin/foo" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/plugins" +%attr(-, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/plugins/* +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__/reload_logging_config" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/rotate" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/core" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/localization" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/warnings" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/http" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/keystore" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/bootstrap" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/apm" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/docs" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/node_modules" +%attr(-, %{USER}, %{GROUP}) "%{INSTALL_DIR}/node_modules/*" +%attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/node_modules/.yarn-integrity" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/node" +%attr(-, %{USER}, %{GROUP}) "%{INSTALL_DIR}/node/*" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/data" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/plugins" +%attr(-, %{USER}, %{GROUP}) "%{INSTALL_DIR}/plugins/*" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/bin" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/remove/settings.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/remove/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/remove/remove.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/dev.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/list/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/list/list.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/lib/logger.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/lib/errors.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/lib/log_warnings.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/opensearch_dashboards.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/downloaders/file.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/downloaders/http.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/zip.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/download.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/install.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/settings.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/rename.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/invalid_name.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/test_plugin_different_version.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/banana.jpg" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/test_plugin_no_opensearch_dashboards.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/test_plugin.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/corrupt.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/__fixtures__/replies/test_plugin_many.zip" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/cleanup.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/pack.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/install/progress.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/cli.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_plugin/dist.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/cli_keystore.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/add.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/create.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/utils/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/utils/prompt.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/dev.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/get_keystore.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/remove.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/dist.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli_keystore/list.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/apm.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/root/force.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/root/is_root.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/root/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/polyfill.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/node_version_validator.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/harden/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/harden/child_process.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/harden/lodash_template.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/no_transpilation.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/exit_on_warning.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/setup_node_env/dist.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/np_ui_plugin_public_dirs.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/optimize_mixin.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/proxy_bundles_route.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/file_hash.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/file_hash_cache.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/__fixtures__/plugin/foo/plugin.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/__fixtures__/outside_output.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/bundles_route.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/optimize/bundles_route/dynamic_asset_response.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/command.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/help.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/cli.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/serve.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/read_keystore.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__/invalid_config.yml" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__/reload_logging_config/opensearch_dashboards_log_file.test.yml" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__/reload_logging_config/opensearch_dashboards_log_console.test.yml" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/serve/integration_tests/__fixtures__/reload_logging_config/opensearch_dashboards.test.yml" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/cli/dist.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils/unset.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils/version.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils/artifact_type.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/utils/deep_clone_with_buffers.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/rotate/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/rotate/log_rotator.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/apply_filters_to_keys.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_format.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_reporter.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_format_json.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_with_metadata.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/configuration.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_interceptor.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/logging/log_format_string.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/core/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/localization/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/localization/telemetry_localization_collector.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/localization/file_integrity.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/get_translations_path.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/i18n/constants.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/osd_server.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/warnings/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/http/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/http/register_hapi_plugins.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/http/setup_base_path_provider.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config/override.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config/complete.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config/schema.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/config/config.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/keystore/keystore.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/keystore/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/server/keystore/errors.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_mixin.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/ui_render_mixin.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/bootstrap/osd_bundles_loader_source.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/bootstrap/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/bootstrap/template.js.hbs" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/ui_render/bootstrap/app_bootstrap.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/legacy/ui/apm/index.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/docs/docs_repo.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/src/docs/cli.js" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/package.json" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/LICENSE.txt" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/NOTICE.txt" +%attr(640, %{USER}, %{GROUP}) "%{INSTALL_DIR}/README.txt" +%attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/bin/use_node" +%attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/bin/opensearch-dashboards" +%attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/bin/opensearch-dashboards-plugin" +%attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/bin/opensearch-dashboards-keystore" +%dir %attr(750, %{USER}, %{GROUP}) "%{INSTALL_DIR}/config" +%attr(640, %{USER}, %{GROUP}) "%{CONFIG_DIR}/node.options" +%attr(640, root, root) "/etc/systemd/system/wazuh-dashboard.service" + +%changelog +* Fri May 05 2023 support - %{version} +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon Apr 24 2023 support - 4.4.2 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon Apr 17 2023 support - 4.4.1 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Wed Jan 18 2023 support - 4.4.0 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Thu Nov 10 2022 support - 4.3.10 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon Oct 03 2022 support - 4.3.9 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon Sep 19 2022 support - 4.3.8 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon Aug 08 2022 support - 4.3.7 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Thu Jul 07 2022 support - 4.3.6 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Wed Jun 29 2022 support - 4.3.5 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Tue Jun 07 2022 support - 4.3.4 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Tue May 31 2022 support - 4.3.3 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Mon May 30 2022 support - 4.3.2 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Wed May 18 2022 support - 4.3.1 +- More info: https://documentation.wazuh.com/current/release-notes/ +* Thu May 05 2022 support - 4.3.0 +- More info: https://documentation.wazuh.com/current/release-notes/ diff --git a/dev-tools/signoff-check.sh b/dev-tools/signoff-check.sh index 683628c5664d..cb147e943cf9 100755 --- a/dev-tools/signoff-check.sh +++ b/dev-tools/signoff-check.sh @@ -5,7 +5,7 @@ # Validate input parameters if [ -z $1 ] || [ -z $2 ] then - echo usage: ./signoff-check.sh commit1 commit2 + echo usage: ./signoff_check.sh commit1 commit2 echo echo Checks all of the commits between commit1 \(exclusive\) and commit2 \(inclusive\) echo were made with the --signoff flag enabled diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000000..fa199650b978 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,75 @@ +# Frontend development environments + +Install [Docker Desktop][docker-desktop] as per its instructions, available for Windows, Mac +and Linux (Ubuntu, Debian & Fedora). +This ensures that the development experience between Linux, Mac and Windows is as +similar as possible. + +> IMPORTANT: be methodic during the installation of Docker Desktop, and proceed +> step by step as described in their documentation. Make sure that your system +> meets the system requirements before installing Docker Desktop, and read any +> post-installation note, specially on Linux: [Differences between +> Docker Desktop for Linux and Docker Engine][docker-variant]. + +## Pre-requisites + +1. Assign resources to [Docker Desktop][docker-desktop]. The requirements for the + environments are: + + - 8 GB of RAM (minimum) + - 4 cores + + The more resources the better ☺ + +2. Clone the [wazuh-dashboard][app-repo] and the [wazuh-security-dashboards-plugin][security-repo] + repositories at the same level. + +3. Set up user permissions + + The Docker volumes will be created by the internal Docker user, making them + read-only. To prevent this, a new group named `docker-desktop` and GUID 100999 + needs to be created, then added to your user and the source code folder: + + ```bash + sudo groupadd -g 100999 docker-desktop + sudo useradd -u 100999 -g 100999 -M docker-desktop + sudo chown -R docker-desktop:docker-desktop $WZD_HOME + sudo usermod -aG docker-desktop $USER + ``` + +## Understanding Docker contexts + +Before we begin starting Docker containers, we need to understand the +differences between Docker Engine and Docker Desktop, more precisely, that the +use different contexts. + +Carefully read these two sections of the Docker documentation: + +- [Differences between Docker Desktop for Linux and Docker Engine][docker-variant]. +- [Switch between Docker Desktop and Docker Engine][docker-context]. + +Docker Desktop will change to its context automatically at start, so be sure +that any existing Docker container using the default context is **stopped** +before starting Docker Desktop and any of the environments in this folder. + +## Starting up the environments + +Use the sh script to up the environment. + +Example: + +```bash +Usage: ./dev.sh {up|down|stop} [security] +``` + +Once the `wazuh-dashboard` container is up, attach a shell to it and run `yarn start --no-base-path` +to start the application. + +The dependencies of the project will be installed automatically by the `installed` container, +even for the security plugin, if the security flag is provided. + +[docker-desktop]: https://docs.docker.com/get-docker +[docker-variant]: https://docs.docker.com/desktop/install/linux-install/#differences-between-docker-desktop-for-linux-and-docker-engine +[docker-context]: https://docs.docker.com/desktop/install/linux-install/#context +[app-repo]: https://github.com/wazuh/wazuh-dashboard +[security-repo]: https://github.com/wazuh/wazuh-security-dashboards-plugin diff --git a/docker/config/opensearch_dashboards.dev.security.yml b/docker/config/opensearch_dashboards.dev.security.yml new file mode 100644 index 000000000000..5199aa789c33 --- /dev/null +++ b/docker/config/opensearch_dashboards.dev.security.yml @@ -0,0 +1,16 @@ +server.host: "0.0.0.0" + +opensearchDashboards.branding: + useExpandedHeader: false + +opensearch.hosts: ["https://indexer:9200"] +opensearch.ssl.verificationMode: none +opensearch.username: "kibanaserver" +opensearch.password: "kibanaserver" +opensearch.requestHeadersWhitelist: [ authorization,securitytenant ] +opensearch_security.multitenancy.enabled: true +opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] +opensearch_security.readonly_mode.roles: ["kibana_read_only"] + +# Use this setting if you are running opensearch-dashboards without https +opensearch_security.cookie.secure: false diff --git a/docker/config/opensearch_dashboards.dev.yml b/docker/config/opensearch_dashboards.dev.yml new file mode 100644 index 000000000000..88b30aafe3f4 --- /dev/null +++ b/docker/config/opensearch_dashboards.dev.yml @@ -0,0 +1,4 @@ +server.host: "0.0.0.0" + +opensearchDashboards.branding: + useExpandedHeader: false diff --git a/docker/dev.sh b/docker/dev.sh new file mode 100755 index 000000000000..3562d7dbbbf0 --- /dev/null +++ b/docker/dev.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Change working directory to the root of the repository +cd "${0%/*}/.." + +COMPOSE_FILE=docker/dev.yml + +# Check if 2nd argument is security +if [ "$2" = "security" ]; then + export SECURITY_PLUGIN_REPO_PATH="../../wazuh-security-dashboards-plugin" + COMPOSE_FILE=docker/dev_security.yml + +fi + +# Common variables +export REPO_PATH=$(pwd) +export NODE_VERSION=$(cat $REPO_PATH/.nvmrc) +export OPENSEARCH_VERSION=$(bash $REPO_PATH/docker/get_version.sh) + +COMPOSE_CMD="docker compose -f $COMPOSE_FILE" + +print_variables() { + echo "NODE_VERSION: $NODE_VERSION" + echo "OPENSEARCH_VERSION: $OPENSEARCH_VERSION" +} + +case $1 in +up) + print_variables + $COMPOSE_CMD up -d + ;; +down) + echo "Cleaning up..." + $COMPOSE_CMD exec wazuh-dashboard yarn osd clean + $COMPOSE_CMD down + ;; +stop) + $COMPOSE_CMD stop + ;; +*) + echo "Usage: $0 {up|down|stop} [security]" + exit 1 + ;; +esac diff --git a/docker/dev.yml b/docker/dev.yml new file mode 100644 index 000000000000..8f41bf45eb0a --- /dev/null +++ b/docker/dev.yml @@ -0,0 +1,35 @@ +version: "3.9" + +services: + # Runs the bootstrap and exits + installer: + image: node:${NODE_VERSION} + container_name: installer-${OPENSEARCH_VERSION} + volumes: + - ${REPO_PATH}:/home/node/app + user: "1000:1000" + working_dir: /home/node/app + command: > + /bin/bash -c " + yarn osd bootstrap + " + + wazuh-dashboard: + image: node:${NODE_VERSION} + container_name: wazuh-dashboard-${OPENSEARCH_VERSION} + depends_on: + installer: + condition: service_completed_successfully + ports: + - 5601:5601 # Map host port 5601 to container port 5601 + expose: + - "5601" # Expose port 5601 for web access to Wazuh Dashboard + volumes: + - ${REPO_PATH}:/home/node/app + - ${REPO_PATH}/docker/config/opensearch_dashboards.dev.yml:/home/node/app/config/opensearch_dashboards.dev.yml + user: "1000:1000" + working_dir: /home/node/app + command: > + /bin/bash -c " + yarn opensearch snapshot + " diff --git a/docker/dev_security.yml b/docker/dev_security.yml new file mode 100755 index 000000000000..7f6b935ae3ee --- /dev/null +++ b/docker/dev_security.yml @@ -0,0 +1,85 @@ +version: "3.9" + +services: + indexer: + # Specifying the latest available image - modify if you want a specific version + image: opensearchproject/opensearch:${OPENSEARCH_VERSION} + container_name: indexer-${OPENSEARCH_VERSION} + environment: + # Name the cluster + - cluster.name=opensearch-cluster + # Name the node that will run in this container + - node.name=indexer + # Nodes to look for when discovering the cluster + - discovery.seed_hosts=indexer + # Nodes eligible to serve as cluster manager + - cluster.initial_cluster_manager_nodes=indexer + # Disable JVM heap memory swapping + - bootstrap.memory_lock=true + # Set min and max JVM heap sizes to at least 50% of system RAM + - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + # Set memlock to unlimited (no soft or hard limit) + memlock: + soft: -1 + hard: -1 + # Maximum number of open files for the opensearch user - set to at least 65536 + nofile: + soft: 65536 + hard: 65536 + volumes: + # Creates volume called opensearch-data and mounts it to the container + - opensearch-data:/usr/share/opensearch/data + ports: + - 9200:9200 # REST API + - 9600:9600 # Performance Analyzer + networks: + # All of the containers will join the same Docker bridge network + - opensearch-net + + # Runs the bootstrap and exits + installer: + image: node:${NODE_VERSION} + container_name: installer-security-${OPENSEARCH_VERSION} + volumes: + - ${REPO_PATH}:/home/node/app + - ${SECURITY_PLUGIN_REPO_PATH}:/home/node/app/plugins/security + user: "1000:1000" + working_dir: /home/node/app + command: > + /bin/bash -c " + yarn osd bootstrap + cd plugins/security + yarn + " + + wazuh-dashboard: + image: node:${NODE_VERSION} + container_name: wazuh-dashboard-security-${OPENSEARCH_VERSION} + depends_on: + installer: + condition: service_completed_successfully + # indexer: + # condition: service_healthy + ports: + - 5601:5601 # Map host port 5601 to container port 5601 + expose: + - "5601" # Expose port 5601 for web access to Wazuh Dashboard + volumes: + - ${REPO_PATH}:/home/node/app + - ${SECURITY_PLUGIN_REPO_PATH}:/home/node/app/plugins/security + - ${REPO_PATH}/docker/config/opensearch_dashboards.dev.security.yml:/home/node/app/config/opensearch_dashboards.dev.yml + user: "1000" + working_dir: /home/node/app + networks: + - opensearch-net + command: > + /bin/bash -c " + tail -f /dev/null + " + +volumes: + opensearch-data: + +networks: + opensearch-net: diff --git a/docker/get_version.sh b/docker/get_version.sh new file mode 100755 index 000000000000..555dd89e9e9c --- /dev/null +++ b/docker/get_version.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Copyright OpenSearch Contributors +# SPDX-License-Identifier: Apache-2.0 + +set -e + +PACKAGE_VERSION=$(cat package.json \ +| grep version \ +| head -1 \ +| awk -F: '{ print $2 }' \ +| sed 's/[",]//g' \ +| tr -d [:space:]) + +echo "$PACKAGE_VERSION" \ No newline at end of file diff --git a/docs/docker-dev/docker-dev-setup-manual.md b/docs/docker-dev/docker-dev-setup-manual.md index 3263372a3d45..da40ab93f4a2 100644 --- a/docs/docker-dev/docker-dev-setup-manual.md +++ b/docs/docker-dev/docker-dev-setup-manual.md @@ -6,10 +6,10 @@ The following instructions demonstrate how to set up a development environment f 2. In the terminal, run the command below. * This should create a folder named `opensearch-dashboards-docker-dev` and it should contain two files: `docker-compose.yml` and `entrypoint.sh`. - * Here is the link to the installer script: `https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev-tools/install-docker-dev.sh` if needed. + * Here is the link to the installer script: `https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev_tools/install_docker_dev.sh` if needed. ```bash -curl -o- https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev-tools/install-docker-dev.sh | bash +curl -o- https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev_tools/install_docker_dev.sh | bash ``` 3. Open VS Code or [install it](https://code.visualstudio.com/download), if it's not already installed. @@ -66,7 +66,7 @@ This section explains how to run Selenium functional tests using Docker and debu 2. Make sure you have completed steps 1-5 in the [Docker Development Environment Setup](#docker-development-environment-setup). Now, ensure you have 5 files, `docker-compose.yml`, `docker-compose.selenium.yml`, `Dockerfile.selenium`, `entrypoint.sh` and `start-vnc.sh`. You can also download them by running the installer script. This time you need to pass a parameter `--ftr`. ```bash -curl -o- https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev-tools/install-docker-dev.sh | bash -s -- --ftr +curl -o- https://raw.githubusercontent.com/opensearch-project/OpenSearch-Dashboards/main/dev_tools/install_docker_dev.sh | bash -s -- --ftr ``` 3. In the terminal, run the following commands to stop any running containers, build the new configuration, and start the containers: diff --git a/package.json b/package.json index bdf58db3be06..46cd1b72bfb8 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,10 @@ "number": 8467, "sha": "6cb7fec4e154faa0a4a3fee4b33dfef91b9870d9" }, + "wazuh": { + "version": "4.9.0", + "revision": "00" + }, "homepage": "https://opensearch.org", "bugs": { "url": "http://github.com/opensearch-project/OpenSearch-Dashboards/issues" @@ -75,7 +79,9 @@ "docs:acceptApiChanges": "scripts/use_node --max-old-space-size=6144 scripts/check_published_api_changes.js --accept", "osd:bootstrap": "scripts/use_node scripts/build_ts_refs && scripts/use_node scripts/register_git_hook", "spec_to_console": "scripts/use_node scripts/spec_to_console", - "pkg-version": "scripts/use_node -e \"console.log(require('./package.json').version)\"" + "pkg-version": "scripts/use_node -e \"console.log(require('./package.json').version)\"", + "wzd-revision": "scripts/use_node -e \"console.log(require('./package.json').wazuh.revision)\"", + "wzd-version": "scripts/use_node -e \"console.log(require('./package.json').wazuh.version)\"" }, "repository": { "type": "git", diff --git a/packages/osd-config/src/__snapshots__/env.test.ts.snap b/packages/osd-config/src/__snapshots__/env.test.ts.snap index 74a05672b5d0..a5143dd6d9ea 100644 --- a/packages/osd-config/src/__snapshots__/env.test.ts.snap +++ b/packages/osd-config/src/__snapshots__/env.test.ts.snap @@ -34,6 +34,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "v1", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -77,6 +78,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "v1", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -119,6 +121,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "some-version", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -161,6 +164,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "some-version", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -203,6 +207,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "some-version", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -245,6 +250,7 @@ Env { "buildSha": "feature-v1-build-sha", "dist": true, "version": "v1", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -287,6 +293,7 @@ Env { "buildSha": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "dist": false, "version": "v1", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/test/opensearchDashboardsRoot/src/plugins", @@ -329,6 +336,7 @@ Env { "buildSha": "feature-v1-build-sha", "dist": true, "version": "v1", + "wazuhVersion": "4.x.x", }, "pluginSearchPaths": Array [ "/some/home/dir/src/plugins", diff --git a/packages/osd-config/src/config_service.test.ts b/packages/osd-config/src/config_service.test.ts index 0f634537be7e..65a06598a6ec 100644 --- a/packages/osd-config/src/config_service.test.ts +++ b/packages/osd-config/src/config_service.test.ts @@ -48,6 +48,9 @@ const packageInfos: RawPackageInfo = { number: 42, sha: 'one', }, + wazuh: { + version: '4.5.0', + }, }; const emptyArgv = getEnvOptions(); const defaultEnv = new Env('/opensearch-dashboards', packageInfos, emptyArgv); @@ -270,6 +273,9 @@ test('correctly passes context', async () => { number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.5.0', + }, }; const env = new Env('/opensearch-dashboards', mockPackage, getEnvOptions()); diff --git a/packages/osd-config/src/env.test.ts b/packages/osd-config/src/env.test.ts index 32febbc52eb0..bffc1af4bf86 100644 --- a/packages/osd-config/src/env.test.ts +++ b/packages/osd-config/src/env.test.ts @@ -42,6 +42,9 @@ const packageInfos: RawPackageInfo = { number: 42, sha: 'one', }, + wazuh: { + version: '4.x.x', + }, }; beforeEach(() => { @@ -52,6 +55,9 @@ test('correctly creates default environment in dev mode when isDevClusterMaster mockPackage.raw = { branch: 'some-branch', version: 'some-version', + wazuh: { + version: '4.x.x', + }, }; const defaultEnv = Env.createDefault( @@ -71,6 +77,9 @@ test('correctly creates default environment in dev mode when isDevClusterManager mockPackage.raw = { branch: 'some-branch', version: 'some-version', + wazuh: { + version: '4.x.x', + }, }; const defaultEnv = Env.createDefault( @@ -90,6 +99,9 @@ test('correctly creates default environment in dev mode when isDevClusterManager mockPackage.raw = { branch: 'some-branch', version: 'some-version', + wazuh: { + version: '4.x.x', + }, }; const defaultEnv = Env.createDefault( @@ -114,6 +126,9 @@ test('correctly creates default environment in prod distributable mode.', () => number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }; const defaultEnv = Env.createDefault( @@ -136,6 +151,9 @@ test('correctly creates default environment in prod non-distributable mode.', () number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }; const defaultEnv = Env.createDefault( @@ -158,6 +176,9 @@ test('correctly creates default environment if `--env.name` is supplied.', () => number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }; const defaultDevEnv = Env.createDefault( @@ -191,6 +212,9 @@ test('correctly creates environment with constructor.', () => { number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }, getEnvOptions({ cliArgs: { dev: false }, diff --git a/packages/osd-config/src/env.ts b/packages/osd-config/src/env.ts index e27498c341a0..e82355595e99 100644 --- a/packages/osd-config/src/env.ts +++ b/packages/osd-config/src/env.ts @@ -67,6 +67,9 @@ export interface RawPackageInfo { number: number; sha: string; }; + wazuh: { + version: string; + }; } export class Env { @@ -159,6 +162,7 @@ export class Env { : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', version: pkg.version, dist: isOpenSearchDashboardsDistributable, + wazuhVersion: pkg.wazuh.version, }); } } diff --git a/packages/osd-config/src/types.ts b/packages/osd-config/src/types.ts index c4a82f68502b..1a0927770d08 100644 --- a/packages/osd-config/src/types.ts +++ b/packages/osd-config/src/types.ts @@ -37,6 +37,7 @@ export interface PackageInfo { buildNum: number; buildSha: string; dist: boolean; + wazuhVersion: string; } /** diff --git a/src/cli_plugin/install/settings.js b/src/cli_plugin/install/settings.js index cfd576f8ff5a..3a878dcfffd1 100644 --- a/src/cli_plugin/install/settings.js +++ b/src/cli_plugin/install/settings.js @@ -36,9 +36,12 @@ import { fromRoot } from '../../core/server/utils'; const LATEST_PLUGIN_BASE_URL = 'https://ci.opensearch.org/ci/dbc/distribution-build-opensearch-dashboards'; +const LATEST_WAZUH_PLUGIN_BASE_URL = 'https://packages-dev.wazuh.com/pre-release/ui/dashboard'; -function generateUrls({ version, plugin }) { - return [plugin, generatePluginUrl(version, plugin)]; +function generateUrls({ version, plugin, wazuhVersion }) { + return plugin.includes('wazuh') + ? [plugin, generateWazuhPluginUrl(wazuhVersion, plugin)] + : [plugin, generatePluginUrl(version, plugin)]; } function generatePluginUrl(version, plugin) { @@ -49,6 +52,10 @@ function generatePluginUrl(version, plugin) { return `${LATEST_PLUGIN_BASE_URL}/${version}/latest/${platform}/${arch}/${type}/builds/opensearch-dashboards/plugins/${plugin}-${version}.zip`; } +function generateWazuhPluginUrl(version, plugin) { + return `${LATEST_WAZUH_PLUGIN_BASE_URL}/${plugin}-${version}-1.zip`; +} + export function parseMilliseconds(val) { let result; @@ -70,6 +77,7 @@ export function parse(command, options, osdPackage) { config: options.config || '', plugin: command, version: osdPackage.version, + wazuhVersion: osdPackage.wazuh.version, pluginDir: fromRoot('plugins'), }; @@ -77,5 +85,8 @@ export function parse(command, options, osdPackage) { settings.workingPath = resolve(settings.pluginDir, '.plugin.installing'); settings.tempArchiveFile = resolve(settings.workingPath, 'archive.part'); + // Clean up. + delete settings.wazuhVersion; + return settings; } diff --git a/src/cli_plugin/install/settings.test.js b/src/cli_plugin/install/settings.test.js index 60313e3fe9b8..07b19da3ffeb 100644 --- a/src/cli_plugin/install/settings.test.js +++ b/src/cli_plugin/install/settings.test.js @@ -61,7 +61,12 @@ describe('parseMilliseconds function', function () { describe('parse function', function () { const command = 'plugin name'; const defaultOptions = { pluginDir: fromRoot('plugins') }; - const osdPackage = { version: 1234 }; + const osdPackage = { + version: 1234, + wazuh: { + version: 1234, + }, + }; afterAll(() => { Object.defineProperties(process, { diff --git a/src/core/common/logos/__snapshots__/get_logos.test.ts.snap b/src/core/common/logos/__snapshots__/get_logos.test.ts.snap index 6c7746f3533a..cfd1b9f7e3cf 100644 --- a/src/core/common/logos/__snapshots__/get_logos.test.ts.snap +++ b/src/core/common/logos/__snapshots__/get_logos.test.ts.snap @@ -512,11 +512,11 @@ colorScheme = "light" exports[`getLogos when unbranded returns the correct logos 1`] = ` AnimatedMark.dark.type = "default" -AnimatedMark.dark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_dark.svg" +AnimatedMark.dark.url = "/mocked/base/path/ui/logos/spinner_on_dark.gif" AnimatedMark.light.type = "default" -AnimatedMark.light.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_light.svg" +AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" -AnimatedMark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_light.svg" +AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" Application.dark.type = "default" Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" Application.light.type = "default" @@ -546,11 +546,11 @@ colorScheme = "light" exports[`getLogos when unbranded returns the correct logos when dark color scheme is requested 1`] = ` AnimatedMark.dark.type = "default" -AnimatedMark.dark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_dark.svg" +AnimatedMark.dark.url = "/mocked/base/path/ui/logos/spinner_on_dark.gif" AnimatedMark.light.type = "default" -AnimatedMark.light.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_light.svg" +AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" -AnimatedMark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_dark.svg" +AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_dark.gif" Application.dark.type = "default" Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" Application.light.type = "default" @@ -580,11 +580,11 @@ colorScheme = "dark" exports[`getLogos when unbranded returns the correct logos when light color scheme is requested 1`] = ` AnimatedMark.dark.type = "default" -AnimatedMark.dark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_dark.svg" +AnimatedMark.dark.url = "/mocked/base/path/ui/logos/spinner_on_dark.gif" AnimatedMark.light.type = "default" -AnimatedMark.light.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_light.svg" +AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" -AnimatedMark.url = "/mocked/base/path/ui/logos/opensearch_spinner_on_light.svg" +AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" Application.dark.type = "default" Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" Application.light.type = "default" diff --git a/src/core/common/logos/get_logos.ts b/src/core/common/logos/get_logos.ts index c27a5306e9e1..6517cd16ab38 100644 --- a/src/core/common/logos/get_logos.ts +++ b/src/core/common/logos/get_logos.ts @@ -21,9 +21,9 @@ export const MARK_ON_DARK = 'ui/logos/opensearch_mark_on_dark.svg'; export const CENTER_MARK_THEMED = 'ui/logos/opensearch_center_mark.svg'; export const CENTER_MARK_ON_LIGHT = 'ui/logos/opensearch_center_mark_on_light.svg'; export const CENTER_MARK_ON_DARK = 'ui/logos/opensearch_center_mark_on_dark.svg'; -export const ANIMATED_MARK_THEMED = 'ui/logos/opensearch_spinner.svg'; -export const ANIMATED_MARK_ON_LIGHT = 'ui/logos/opensearch_spinner_on_light.svg'; -export const ANIMATED_MARK_ON_DARK = 'ui/logos/opensearch_spinner_on_dark.svg'; +export const ANIMATED_MARK_THEMED = 'ui/logos/spinner.svg'; +export const ANIMATED_MARK_ON_LIGHT = 'ui/logos/spinner_on_light.gif'; +export const ANIMATED_MARK_ON_DARK = 'ui/logos/spinner_on_dark.gif'; interface AssetOption { url?: string; diff --git a/src/core/public/chrome/chrome_service.tsx b/src/core/public/chrome/chrome_service.tsx index 480c10e4186b..3196c764a4af 100644 --- a/src/core/public/chrome/chrome_service.tsx +++ b/src/core/public/chrome/chrome_service.tsx @@ -248,13 +248,13 @@ export class ChromeService { basePath={http.basePath} breadcrumbs$={breadcrumbs$.pipe(takeUntil(this.stop$))} customNavLink$={customNavLink$.pipe(takeUntil(this.stop$))} - opensearchDashboardsDocLink={docLinks.links.opensearchDashboards.introduction} + opensearchDashboardsDocLink={docLinks.links.wazuh.index} forceAppSwitcherNavigation$={navLinks.getForceAppSwitcherNavigation$()} helpExtension$={helpExtension$.pipe(takeUntil(this.stop$))} helpSupportUrl$={helpSupportUrl$.pipe(takeUntil(this.stop$))} homeHref={http.basePath.prepend('/app/home')} isVisible$={this.isVisible$} - opensearchDashboardsVersion={injectedMetadata.getOpenSearchDashboardsVersion()} + opensearchDashboardsVersion={injectedMetadata.getWazuhVersion()} navLinks$={navLinks.getNavLinks$()} recentlyAccessed$={recentlyAccessed.get$()} navControlsLeft$={navControls.getLeft$()} diff --git a/src/core/public/chrome/constants.ts b/src/core/public/chrome/constants.ts index 5008f8b4a69a..2fa80237566e 100644 --- a/src/core/public/chrome/constants.ts +++ b/src/core/public/chrome/constants.ts @@ -28,6 +28,6 @@ * under the License. */ -export const OPENSEARCH_DASHBOARDS_ASK_OPENSEARCH_LINK = 'https://forum.opensearch.org/'; -export const GITHUB_CREATE_ISSUE_LINK = - 'https://github.com/opensearch-project/OpenSearch-Dashboards/issues/new/choose'; +export const OPENSEARCH_DASHBOARDS_FEEDBACK_LINK = 'https://wazuh.com/community/join-us-on-slack'; +export const OPENSEARCH_DASHBOARDS_ASK_OPENSEARCH_LINK = OPENSEARCH_DASHBOARDS_FEEDBACK_LINK; +export const GITHUB_CREATE_ISSUE_LINK = 'https://github.com/wazuh/wazuh/issues/new/choose'; diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index 7b4e3ba472dc..52378a456579 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -128,14 +128,14 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2071,14 +2071,14 @@ exports[`CollapsibleNav renders the default nav 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2374,14 +2374,14 @@ exports[`CollapsibleNav renders the default nav 2`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2677,14 +2677,14 @@ exports[`CollapsibleNav renders the default nav 3`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -5503,14 +5503,14 @@ exports[`CollapsibleNav without custom branding renders the nav bar in dark mode "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "Application": Object { "dark": Object { @@ -6606,14 +6606,14 @@ exports[`CollapsibleNav without custom branding renders the nav bar in default m "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/test/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/test/ui/logos/opensearch_spinner_on_light.svg", + "url": "/test/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap index 84821e0ab4e4..c4c10fbfc512 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap @@ -1432,14 +1432,14 @@ exports[`Header handles visibility and lock changes 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2089,14 +2089,14 @@ exports[`Header handles visibility and lock changes 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2591,14 +2591,14 @@ exports[`Header handles visibility and lock changes 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -3344,14 +3344,14 @@ exports[`Header handles visibility and lock changes 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -3573,7 +3573,7 @@ exports[`Header handles visibility and lock changes 1`] = ` data-euiicon-type="home" data-test-image-url="home" data-test-subj="homeIcon" - title="opensearch dashboards home" + title="Wazuh dashboards home" />
@@ -6015,14 +6015,14 @@ exports[`Header handles visibility and lock changes 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -8154,14 +8154,14 @@ exports[`Header renders condensed header 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -8923,14 +8923,14 @@ exports[`Header renders condensed header 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -9105,10 +9105,10 @@ exports[`Header renders condensed header 1`] = ` >
@@ -11545,14 +11545,14 @@ exports[`Header renders condensed header 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { diff --git a/src/core/public/chrome/ui/header/__snapshots__/header_help_menu.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header_help_menu.test.tsx.snap index 036e2b4ee0ce..2173ce50c764 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/header_help_menu.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/header_help_menu.test.tsx.snap @@ -1798,7 +1798,7 @@ exports[`Header help menu hides survey link 1`] = ` - Documentation + Wazuh documentation @@ -1815,7 +1815,7 @@ exports[`Header help menu hides survey link 1`] = ` - Community + Ask Wazuh @@ -1828,7 +1828,7 @@ exports[`Header help menu hides survey link 1`] = ` /> @@ -2019,11 +2019,11 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonEmpty__text" > - Documentation + Wazuh documentation @@ -2065,11 +2065,11 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonEmpty__text" > - Community + Ask Wazuh @@ -2092,14 +2092,14 @@ exports[`Header help menu hides survey link 1`] = ` @@ -3958,7 +3958,7 @@ exports[`Header help menu renders survey link 1`] = ` - Documentation + Wazuh documentation @@ -3975,7 +3975,7 @@ exports[`Header help menu renders survey link 1`] = ` - Community + Ask Wazuh @@ -4008,7 +4008,7 @@ exports[`Header help menu renders survey link 1`] = ` /> @@ -4199,11 +4199,11 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__text" > - Documentation + Wazuh documentation @@ -4245,11 +4245,11 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__text" > - Community + Ask Wazuh @@ -4321,14 +4321,14 @@ exports[`Header help menu renders survey link 1`] = ` diff --git a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap index c1a7c11b69f9..adcce5bb2e55 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap @@ -28,7 +28,7 @@ exports[`Home icon, unbranded, uses the home icon when header is expanded 1`] = data-test-image-url="home" data-test-subj="homeIcon" size="m" - title="opensearch dashboards home" + title="Wazuh dashboards home" type="home" /> `; @@ -36,10 +36,10 @@ exports[`Home icon, unbranded, uses the home icon when header is expanded 1`] = exports[`Home icon, unbranded, uses the mark logo when header is not expanded 1`] = ` `; diff --git a/src/core/public/chrome/ui/header/header_help_menu.tsx b/src/core/public/chrome/ui/header/header_help_menu.tsx index 0eba4c0c2673..33b858177118 100644 --- a/src/core/public/chrome/ui/header/header_help_menu.tsx +++ b/src/core/public/chrome/ui/header/header_help_menu.tsx @@ -208,7 +208,7 @@ class HeaderHelpMenuUI extends Component { @@ -217,7 +217,7 @@ class HeaderHelpMenuUI extends Component { diff --git a/src/core/public/chrome/ui/header/home_icon.test.tsx b/src/core/public/chrome/ui/header/home_icon.test.tsx index 05ffd5591594..62fc0d6bc8b4 100644 --- a/src/core/public/chrome/ui/header/home_icon.test.tsx +++ b/src/core/public/chrome/ui/header/home_icon.test.tsx @@ -24,7 +24,7 @@ describe('Home icon,', () => { expect(icon.prop('data-test-subj')).toEqual('homeIcon'); expect(icon.prop('type')).toEqual('home'); expect(icon.prop('size')).toEqual('m'); - expect(icon.prop('title')).toEqual('opensearch dashboards home'); + expect(icon.prop('title')).toEqual('Wazuh dashboards home'); }); it('uses the home icon when header is expanded', () => { @@ -39,7 +39,7 @@ describe('Home icon,', () => { expect(icon.prop('data-test-subj')).toEqual('homeIcon'); expect(icon.prop('type')).toEqual('home'); expect(icon.prop('size')).toEqual('m'); - expect(icon.prop('title')).toEqual('opensearch dashboards home'); + expect(icon.prop('title')).toEqual('Wazuh dashboards home'); expect(component).toMatchSnapshot(); }); @@ -53,10 +53,10 @@ describe('Home icon,', () => { }; const component = shallow(); const icon = component.find('EuiIcon'); - expect(icon.prop('data-test-subj')).toEqual('defaultMark'); - expect(icon.prop('type')).toEqual(props.logos.Mark.url); - expect(icon.prop('size')).toEqual('l'); - expect(icon.prop('title')).toEqual('opensearch dashboards home'); + expect(icon.prop('data-test-subj')).toEqual('homeIcon'); + expect(icon.prop('type')).toEqual('home'); + expect(icon.prop('size')).toEqual('m'); + expect(icon.prop('title')).toEqual('Wazuh dashboards home'); expect(component).toMatchSnapshot(); }); diff --git a/src/core/public/chrome/ui/header/home_icon.tsx b/src/core/public/chrome/ui/header/home_icon.tsx index 2c0beb5a26cb..ccb02ba2583c 100644 --- a/src/core/public/chrome/ui/header/home_icon.tsx +++ b/src/core/public/chrome/ui/header/home_icon.tsx @@ -17,7 +17,8 @@ interface Props { * Use branding configurations to render the header mark on the nav bar. */ export const HomeIcon = ({ branding, logos }: Props) => { - const { applicationTitle = 'opensearch dashboards', useExpandedHeader = true } = branding; + // Removed prop unnecessary useExpandedHeader Wazuh dashboards + const { applicationTitle = 'Wazuh dashboards' } = branding; const { url: markURL, type: markType } = logos.Mark; @@ -26,8 +27,8 @@ export const HomeIcon = ({ branding, logos }: Props) => { // Marks look better at the large size let markIconSize: IconSize = 'l'; - // If no custom branded mark was set, use `home` icon only for expanded headers - if (markType !== 'custom' && useExpandedHeader) { + // If no custom branded mark was set, use `home` icon Wazuh dashboards + if (markType !== 'custom') { markIcon = 'home'; testSubj = 'homeIcon'; // Home icon should be medium to fit in with other icons diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 0acf4524ab14..9401c9299c89 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -62,11 +62,17 @@ export class DocLinksService { const OPENSEARCH_WEBSITE_DOCS = `${OPENSEARCH_WEBSITE_URL}docs/${DOC_LINK_VERSION}`; const OPENSEARCH_VERSIONED_DOCS = `${OPENSEARCH_WEBSITE_DOCS}/opensearch/`; const OPENSEARCH_DASHBOARDS_VERSIONED_DOCS = `${OPENSEARCH_WEBSITE_DOCS}/dashboards/`; + const WAZUH_DOC_VERSION = injectedMetadata.getWazuhDocVersion(); + const WAZUH_WEBSITE_DOCS = `https://documentation.wazuh.com/${WAZUH_DOC_VERSION}`; return deepFreeze({ DOC_LINK_VERSION, OPENSEARCH_WEBSITE_URL, + WAZUH_DOC_VERSION, links: { + wazuh: { + index: `${WAZUH_WEBSITE_DOCS}/index.html`, + }, opensearch: { // https://opensearch.org/docs/latest/opensearch/index/ introduction: `${OPENSEARCH_VERSIONED_DOCS}index/`, @@ -618,7 +624,11 @@ export class DocLinksService { export interface DocLinksStart { readonly DOC_LINK_VERSION: string; readonly OPENSEARCH_WEBSITE_URL: string; + readonly WAZUH_DOC_VERSION: string; readonly links: { + readonly wazuh: { + readonly index: string; + }; readonly opensearch: { readonly introduction: string; readonly installation: { diff --git a/src/core/public/injected_metadata/injected_metadata_service.mock.ts b/src/core/public/injected_metadata/injected_metadata_service.mock.ts index c91a4e446b1e..bcbc8b2c12cf 100644 --- a/src/core/public/injected_metadata/injected_metadata_service.mock.ts +++ b/src/core/public/injected_metadata/injected_metadata_service.mock.ts @@ -46,6 +46,8 @@ const createSetupContractMock = () => { getOpenSearchDashboardsBuildNumber: jest.fn(), getBranding: jest.fn(), getSurvey: jest.fn(), + getWazuhVersion: jest.fn(), + getWazuhDocVersion: jest.fn(), }; setupContract.getCspConfig.mockReturnValue({ warnLegacyBrowsers: true }); setupContract.getOpenSearchDashboardsVersion.mockReturnValue('opensearchDashboardsVersion'); @@ -62,6 +64,8 @@ const createSetupContractMock = () => { }, } as any); setupContract.getPlugins.mockReturnValue([]); + setupContract.getWazuhVersion.mockReturnValue('4.x.x'); + setupContract.getWazuhDocVersion.mockReturnValue('4.x'); return setupContract; }; diff --git a/src/core/public/injected_metadata/injected_metadata_service.ts b/src/core/public/injected_metadata/injected_metadata_service.ts index f4c6a7f7b91a..941a07b46984 100644 --- a/src/core/public/injected_metadata/injected_metadata_service.ts +++ b/src/core/public/injected_metadata/injected_metadata_service.ts @@ -53,6 +53,7 @@ export interface InjectedMetadataParams { version: string; buildNumber: number; branch: string; + wazuhVersion: string; basePath: string; serverBasePath: string; category?: AppCategory; @@ -88,11 +89,11 @@ export interface InjectedMetadataParams { * @internal */ export class InjectedMetadataService { - private state = deepFreeze( - this.params.injectedMetadata - ) as InjectedMetadataParams['injectedMetadata']; + private state: InjectedMetadataParams['injectedMetadata']; - constructor(private readonly params: InjectedMetadataParams) {} + constructor(params: InjectedMetadataParams) { + this.state = deepFreeze(params.injectedMetadata) as InjectedMetadataParams['injectedMetadata']; + } public start(): InjectedMetadataStart { return this.setup(); @@ -151,6 +152,14 @@ export class InjectedMetadataService { getSurvey: () => { return this.state.survey; }, + + getWazuhVersion: () => { + return this.state.wazuhVersion; + }, + + getWazuhDocVersion: () => { + return this.state.wazuhVersion?.split('.').slice(0, 2).join('.') || 'current'; + }, }; } } @@ -186,6 +195,8 @@ export interface InjectedMetadataSetup { }; getBranding: () => Branding; getSurvey: () => string | undefined; + getWazuhVersion: () => string; + getWazuhDocVersion: () => string; } /** @internal */ diff --git a/src/core/public/mocks.ts b/src/core/public/mocks.ts index 3acc71424b91..6c7c1c8b83ce 100644 --- a/src/core/public/mocks.ts +++ b/src/core/public/mocks.ts @@ -130,6 +130,7 @@ function pluginInitializerContextMock() { buildNum: 100, buildSha: 'buildSha', dist: false, + wazuhVersion: 'wazuhVersion', }, }, config: { @@ -155,6 +156,7 @@ function createCoreContext(): CoreContext { buildNum: 100, buildSha: 'buildSha', dist: false, + wazuhVersion: 'wazuhVersion', }, }, }; diff --git a/src/core/public/rendering/rendering_service.tsx b/src/core/public/rendering/rendering_service.tsx index 5ac8683b44da..466f71605fc9 100644 --- a/src/core/public/rendering/rendering_service.tsx +++ b/src/core/public/rendering/rendering_service.tsx @@ -58,9 +58,15 @@ export class RenderingService { const appUi = application.getComponent(); const bannerUi = overlays.banners.getComponent(); + /** + * This is done so that modifications to login styles are only applied to the login. + */ + const pathName = chromeUi.props.application?.history?.location?.pathname || ''; + const classContent = pathName === '/app/login' ? 'content wz-login' : 'content'; + ReactDOM.render( -
+
{chromeUi} -t{Tecj*t`kebdiI(OD-1`pg0|0>A z$PjPMDj9zsC|)xpeE&7I<_;PyvGA;i~@r40b;xDY=#_lra->H^Wji>x8B)Yu|{@*-$RoH=Qx zXy&I&^z<^k96+?WY;Nm*`J%fjK?0|VQV&sM0r(QBZm1AnA9A2th=#Z!z8X6rO9IOzmq(BMqKx0%@RndxAG!`q* zl8_G!B~#r(WzRYQX1?7v6h>-RS-Iq*M`V#N#{ z;^v3OC@B6J)n9^UX8*saukYW|fmCbafBpSGfdg$r{fKC5Vj$&GfIDmMNRod{`Kjp! z5Z$Ph09y*h=dVCodQzyAKu?Mv3ag}mLCKu)A`>XVfye%(U}mOfL=L37k==<#cnt{_ zgo2kBK~4JvR$o!~gsz_QNfiu6Pge)4qQr`os-BJ_R!97fh2!`c2D&-q`EUCtSQ=;4Q8W zK_c)Ev@?KDf`~*ZJa?>t*zd`)y{6NC&nENon+7Jo=0_~~0d%IJz!^O0VS@5|vPDJM9B>eR{SarC~HCD+mJ7Ru~szU#H#L)kw* z*UEnS3c~|uhVsVnq|AD=FD~(F8>UjNTDv=1c`ZLN)#bgKQ!Yafb82i3@`7x^2FoV= zWhstGbF8;*k2g5zld z1#e#AqX<(8S58*X=kyUraj1c~mm2gB5xr-#)2#?GFK>4!>8NF6%4X;Y3}k7w_Lq_j5ea%JBfAkoeBnr$B%9ID%`2Z?tdNfF(Mv{ z+OK{kGIuO6P1rG4TTgSTt@K6dF~KWR3_r~Xg~AOO{J^rNs5#`D*cr@+-UW%I9L6V! z$vUM3;DJBq%f~;siyUBb94ng5G^pR95Z|SPy;rzOdtwnW$#Ro#TL9#E&3Z22aA78t z^xN8raJX{7WeSs)4q==J^-4ZVyddtrVkX8Gp>z%Kz=T~JJ1M{>%##v*=0!1=iZcR` zTc#w3_-y6^AHfY>dV}%o>h0l1QM_tG#;CiNLd8sdAbesF8Ld#s|BKCi zAyh1|SsZ9SA8ULIF%E8jPrD+{5U{%@j(~7Z9CPLeO2x}Ib%H}-WXZe^XEYkN%%gS0 z6gmlVU+Qq?b%j*Zt&j+Hjsw%8bL=3oxQz*C@Cy@HxI$1KkeyEz-Ml@;@5Gq_3&cVg zdL8aFfiVNi*}X9iSAjZO%#WjBZA{7XyEn$b^Rnk@;bzOn4#Z5wUA6)<5#Q|YLiUQ% zI_@6;yUr>+{A9FzT2X&{4#oJWB#YYP3*VnI)M(2OJifP+5N@If38wYMGzP)^xV$1` zw1rw1?Cl_oX*^Dv&IiwDmlK3!_xOM}GhKy@v-@ncf#F?Ta(k}D8T(%{lrBBvdV)?@*H;eaM6qkXRIrmpTkw_QOt2pw$JmV-Gu^w4G%&+)^ z{DdtsT10`bWm+{N{}puV3MaR^tibk%EWqQdS?$yVl~#m*&f{lIAO#V5G3L8oyBglt z9?>GNc~J!hl^mbnj+1A<`vzQZ_Rd#9H_9Q=2bc-kq2k%$*SC8fqHj73o;G3rt_>H8 zD;d2%2iZ7u_knD#LI4RPG8H6?JB5gA}gtWeh|; zaZ=EUns4$v(jBAny+|K2GPWt69Z+$2uHw*9&A^Z&k)vcD2neC_?g)_N$4cXC4R_l- z>P-Qud>?qDJPqr#OZ}887^nHu1bMOp3a=T3Uc5i?VGFOjCwgyklzF96PL4N z!s)lP8%WU@kN67^8`ycQq5ba5S&tK)5E)wR;d(sJHO?0g&o+oRics&BOrXZt?;ZRj z!sJ##U1!e)o~e)G45Ey#TzpUlZ`Jz_eIXo*g znjA!r?N^z+Z4W8~r*XmiIM{T}-Go^8+4OAL!z^v7$Qe?UHLg~GIQT@FLPT8eSNqkX z5R=ZF3)QiZ2C_5{f9c4ojR#GR&y~YlhlCBhc;6roh#1**vEXVIQ#zQ(z$pMSA1D>g zkqV}j$iC;!wK-mL)O)|aTbKTmCaToCH-QC8Q8TGcMg<+r2ZhMFucOV?2Id@}nl(sd zwVSvi$C8j0(Su7r3NA!mwD&@HG)ru{i%4dA03Tb^;Q=8s_R6g>(cn@^nIrb2?Xc}E z*F69B00|ml*5VZ3yK(xWUpw6I`p0v!vb6jPwr+NVH)dfLCa`=MJ__Gh>CoI%waTe- zh)_l0?odsH2rc{`ErP2JiSLGmn3&pgxG5%9NM@a(@89BXe8sbxkEnfq!ncq$!e zj{M2hU08QMOZ&CH#b%lZ?%+gf=gt%DS zcuvKTN)e;&g@g^q)SvZHF|_A6ui75t%$J(D`n3~=0%s3SuQkpP1~*y}@Vu5M1JgvuA?pvPk-dBI#&Hl-O zI&R&TBK^m3olRP!om6D(ATAy7$Qk~AQelLf&n&{BN&c|Ojh zH&TW5ypSFt9D5I6nSBG=z_r>GUtC#jMTbjlO2)}adH^@HMSg!PU{}Cdl-=kwpzGb) zD!#wGr4{!_;F^=9M^rX^I9x{h^2&s{-{(8oorhh|{K3}`k^rT&erSC8(+AXRsDBJs*TM4_F8?$gu4Qcc^st6yzV%6xLAvr&5OUPn);!;Ul!Prw0WxnO0G3iIDp$n??ke^7kh* zl1hxxkAs|Xk-;_sK_`=XP($VK6{dCw890wZ&2%8l>LEG!Qr7@ZE zQ%eQh)`AnyZ{S2batqylNDe;TR6X#^%et$U$#eLANEELtR^WUn5-!(t041=hTkoTB zgl4njQPPDvCn+kjac1QHUU)Cp*~eD&`7|8e9!)E6$%V!rryC-fuv3%EpoPmTd6snq zO{y4fA>Q)AJ}Hpm$f=?St-r&3f`-->okW$A6*gZle<^`-`cxkxW;PKhr@TxVUwAW(rFJa%l#yg8VE{Wx$ z>aG4_^K?nT8S#$r96oIMMTE_(yj?c-3EYZ%)$AT~?$l-Icb8`-T^$kpTc z$+%c9*Dl$1?h<~$)ks1&@2b@=@=AxDy%FL3`Lu=3htf6Y*v_q& zky89qzOP|XHJf%lg@PknJn54kk%@NKE!pM7N{n~$Y8E;_x6v{Ylb%xWcop1Ny@clz zq9Em%7e`yw2#CdD+r^DI-k=Vnc-^*^Efs{9+XzH0d2Z|BQeXsj?p-H>_vcu4)Q` zTD7y;m*0%eeQSFDerG2tH5GryyCuBQt_O*CUb%Nxf1a7{67;&}v33&oZEB7?+M@yf z@U+0Sk+t7o!IP`=`$twe({G*wb~^44WXhe|BdJU@oEV8Lkz^PvK6S`CF8s9UedC1d zc>B$X(6hyJac|p5O#Y-GB0b(~IJB+w*{pTStepge5jb!r21O%OpxY($JG2{>b{Axm}a-pjp0e zCCteCK2~*YaPpf`kX9#w?^joC2NhnXQ{<`(svufZD=Ts+L@(PSseduZ?80Z=-2$ee zqJYJ(dYQTv@ob!xNwbvD)$_f(MKQqrVzHx_0dPHIW-v{bRTcG9zoUR@oTt3jGUiZ7 zN{j;7)vi3gYXCx@c0-hrWiqFBPE^a!T#Om0jO&p8CJi``)aNnHmW3C;Jb6$6B-Hd~ zr4PU~Utq;Drw)J+IJcmbaEoOjA=>ZG-70?Y8>O%WCacZ$;>9`hg2{m0lP~9?yijMr zeZcB=t_^sq=yMQB^vyxYt)Un0=!GL7ME%Y$^cy7P))T0JPsh1^A~r@5I)1R54>``W zHbGwBq)7(%DbU<#%({H(u)#?XVy$XM zF!|1swF|GnXARMPx}2cO{_eLqC#~qb0(TNSZ1Z3ct?={QGvUXGbNa`-ACoaC8KF0Ot7DW3w!<~~wr30f4 z+~C!9qZnC-7w*!BAYiIIp~7QbZB70TXIcEl^;B6AnXF`#Y15XhwL9g%VB!JON{2oP-}J+CW|i`I3g&tta7A(DC`E zTf)s@)tS>0%im@qBGC1f0~9c*VOh!rDq120ldGhBU2a}ym!qpfgV_`y$7}fT&pWn* zuF($>HwUe<*DtFM_En)i2~U=8?~E$;l+x)L?f8F3;N`576Y}@17 z@%cUQ)38M8(VbIN(VFq!Z=+j{eer;QnY*&!v|i>n!HTURMubM(_N1o+XigyiGTl}A z(DdV;J4H_4hhARV^<13STIh5H%}bd+inuW*L*h}qc(?viivD7cmD5)`bhynC^y9>H zrxj@Rg@l9l@3sBqQbfmtUya`?*A6$7ohnG^SZZ-sjvfmqJ<8UTseLWc8gYWYy%0S0 zT7bij^-Xkr2S=97k#`M}t(HjI6xxs7)_9pYx=tFVofCdH_U;7_R%HJQR(_8=C&w>1 z7Pqawn9QjpzoF#CVaOi-s{hgWmKGD+&y8rQT#1X){CO1dxS{rjqu$^wH?NjY`LYMO zDf>Kp#hCq!E;B`(@GbDu&9>uWzYKo`YYjEl#Kc&R6)CUk{1$q-Fbt9XtaKF_UGNMx ztyeO*?3+ZD)=`R*JZ$cuC3#sX54yrU__T{TZ+Yv(+TUl4(ay#?kU==Svc=y7&pN(L zSjsCF#ESHKq=CtyP@R7C(aQvjpjx!LOhH&y^PQ~;jY0HE9e zm(c)CasZ;<0Cc1PJ6ZsMvjA+G0GrkTj>Q03f&f8d06AF(J6Hgt-vD8Z07Pd1K47NE z+yH#907q*8JY4`#bpVvj0Fuf8jKTnhy8v>b0B4g*caWUF(|-VozW`Ny08@DYN^Z8+ z=m4VM0A7cz&fr9GivU-DBvo-$ftf5^cN$D+vC`$C#Mh3q$b_oD0E4$?kEZ}zgb_qx z3_o1}nbVfK&Wf(1g=q!2~w6aLU)7^DZi~ zup)G@$$!F1HE3X)#rbtiUz;U(8jJ{SmT`=!>$8;Kn6@L9;$C9Pc39341ZdI&w`!QK zLzdLDF;%w9lFFE_3zp~H%#seL42k8Y#|+M`l! z>2L@>(v1RybjoKw$99DT;2%TS|!#!qWw)cnHAY$~0Ttg*mK4vHMO@dD%*=|*Y^q891C)hrabJmM#8 zVZ^WChaoCO4-?Eom0~G6K>h^{eTAS|dVgp!2UTirWPmvetU=5?jVdfbl|he3oIRSQ z0(%hinjXn~hAQ1wL=SwXz;}qr(PQ5hY$)Pvg}?TGCEY=JddljOvIJLrUlk91r@*?J zGZ2{BwV_7G4Vx)ma zZ*|>YfvbP}|^76T}8G=YY`98Q8JszBr! zDnx}E30er`J{tg99|c7woqw#F8F><8@b}_Any?{3A!@iG;i82kUsW;*X04>C=gj1>~2OBk|vp#M|nORiBRN;uP zcPehld_k<(N9}eoo$Lp=t%!LMtOeLCbvjuuadShLSXdjdF*Q2#a1UdKVAcYT&(9bD z;?zYJ)01ATz-Fw`*?(k&yGd+~F4B(?*eo?V>m|6SDEQf0{iRIzDEF zn^;fT-|?wlOlRvI{*Q3`;dpT8S?0QSz8Ha7l+r)qK02mQm^`3kwmtfnhi*~qnEnyx z=$1lBweHydcMA2CzC))3MxpH)qf1sfwD`8C3T}w@Q_MWmsfrPxu{%U7IX*G4(iK|DqwBO;J2%fC6S~IlJ7_VTo@C5gyLbLF z=rY3|x4&q!sZE-ey3W)utZ=+wpMFoo`)| mBuSDaNs=T& diff --git a/src/core/server/core_app/assets/favicons/android-chrome-512x512.png b/src/core/server/core_app/assets/favicons/android-chrome-512x512.png index 404fbfad398faad3f0bea9949e3a8eebc5888fdc..9eb711bb795cdd6e216cd550dd96719c4771a95a 100644 GIT binary patch literal 17660 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 z≰6?pcG;PMk<%8P{FsD*TGeSZMdiXVSm7{Z}=Xu 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 literal 1868 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 b4ue1fgE?PHS%D+C6l3so^>bP0l+XkKy@RcB literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>*P|S61I-T(3OZw=5@y zsnA-|hUao)+KEpuwjU6(&3)ooSw0hJ4r7wHyNm6G+`vd6hqJ&VvY3H^c>@SDsvqHB z3lwB8@$_|Nf66KYHR01Y=KC_DN=+@gr9daE zmbgZgq$HN4S|t~y0x1R~10zFS15;fi!w^FYD9gP2NC6dvSA|5B1SOU$ z6cpvBW#*(RlvEa^Dr6RvBr`Bn%z6BYhodk|L*tbH=`)^BgBX~Vx%HB{g_VW9CyOu( zE4Vb698O_Y-W;NE`o@(LN6s9PIl_Lr!DE4!9>Xhf!IDo-rc;4dFnGH9xvX3}zf3dtnQWR_eaT@5hlOa_gC-`*64Hyl! zGC4PzFPsjCul&GN3`4mzT2@vTHH$?>R4FtDhr^-KnKUMof+HwutrC-HC`vVXMu88h zr78uADG()KP?RJi8JHi4C;PDq7@d_>s;5s1KQo#}g3=gNx}mBWph)!pP#B&?tFdV4 zQ@;Nxtd7;95G@)~BN-|w-a9$j5DMi6s~`!6sA3T$edZveQV|SMry?l8WKkKw%6NrR zhGePTrwAeuH%zI!c! zoLm~749(Ele|36h3%8G9I%{2gF>8KEi923}Tl;0paa>$j~M_$gDc9Y}n;hCAqVBFz=Uj9{MxuNOeChT%?C7J09HkIi#RodBP)fdxuk$9)mygg z(zViwZ_FQ@IMJ4U3k-1|7-S@^=-NMdV9YKk{k3()9@l}0N|&mY!L9zw+ny3yc}Aty zH{!&r^o6G#sy6NWd$myrmvYv6(FQi^T(n95(t>VJ9OyXY^y(~=%9Ei?={ugj!qSLZ zvUo#YeTW9-XcMjr-}lk3^yVd{*=DdxP3`pew&j=W?SEq?Wh5T`iJ#f*l*4zcXoy){ zaPunDW`6&ElXX`Ii5AvhI}|EJA&JIDP#;ZSw1TT*bXd+D4WP<+fyZ z%xkWZ4s6G4CJGNX$d4x)9}}8vO~||8+T&61Jcb_jHTy5;C0M@=xT~yeXmr4=x<_0b zc$sAMuwr}{A%F~CnsB-Y*EKV=uud3Tx&2W=+UEXdGxn)vCmnqncs49x?5C3xSbborHu?+7iOOc)Bh2GkeCN8hNa+!gF z(a_VyF~s6@>7pfB(z3xVnguzs|nFS#M{%${_`f&O<*c zg{=QPI=ytK<>T}q><8YjB9KVWEXRzA+EHu3qkgiWR!Zroj}y1?}4`J#&B`&L@$ zbE@nXtbG0NZlCYhhdWNebk0nWwe?Tz=V7o|WHMc1zOTYC#H__;XLYI`&-FH|)kS|*-f~EJ z#);ixKEDM|sLOM!&Ja2LL@ct2`#87!+b!{L0}~yaE?oZ06f9-$y1f5-7wf?+hqfQr zbeONN$?bL6d-GYkjL_6Sc13+=zlBpa$mre9M?ij1Kud?_9ifd0-KbLh*2~7aE{_cJN diff --git a/src/core/server/core_app/assets/favicons/favicon.ico b/src/core/server/core_app/assets/favicons/favicon.ico index dd2d62ecec85d74b8432af443756556c882d7656..f5e4095b82e4dab8adfc4ff3fb2311694c365129 100644 GIT binary patch literal 2270 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%0Aq+DGGZ8XdXX-i*F2B<(#l**WtUrpZ-(a(_tj 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 literal 1836 zcmdUw`9IT-1IPLF8KSv9@?lcm5?bTy$}NrA4D(rX%#|ZY&5_(g#j1^LL|N`*W_-Rm zvr_x!vyU?tAGuBCaC0&0qQQ$qN&t(9#^c z_N~`8&tkNzG5hyK_%O53Pp63n6%qmo&iuNtn>#kA-;+wdAM|dd_2!G_ zklq-9ss)5#J{=QhAC>@3N6X}3W5c|77$bDNYd6!!=CA}uC8 z$xR?vmXBnK;kb~UAOY)g%=^ukNWc7tUc#0;A^`?;9vFmq99&#`5xqNX1!K}ik4K14 z>FI|3TqhY;HHA1XLCMm<$PA`HR?SKXwOMEX%C$40x{!GyJ9o}jY?M(Ne%Qq}j+%13 zz+P3e8F@gv;(o81Xr@rC`76UxY~NhwPlb`$)^5BX1sclY?)nFF>U%}q$ktV)q%)pi zzBoGsfMlx)s=B2EpX9{4Eb`y3uT3gIJ0@pfp3F4K%-|jiXT4eiz2J`0Lfi909_F*W z%Q8zLR$rc4_Cr6 z>*kBRKM%B0gd1ZFb(iDUZ%ws_u;a6IGMf@pAddQ#P2riekz7!ASBiM-U;6|Pv+?*q z;2uMbd2_QPIDgsDL+wAZS9dE+9C7A2e=E3AW0kNXspO^7^7@~|iYpV*`tX>>Is{kS zS~&Tl{qX~%sJi!Qt-cD$pOcd{Rb0&Jvwk)#5B69%XOGiZv?QerwvwEz?*kdzT3P+L zJ6)Pop1{}YEay$ao@K#a87l*+K2wyMM_!B7r;J3&qr~d^B>m2ni7@4pj2nd&&|%2U zVLO;;vi$jU?J(z=JuU;fy}Vp$9=ZYYd-lVEHaFd?bxteP(^hRfg^b#)ktq6JW0NpC zAg>LF5Pyj>bGIKjIZu3o`cmdEx9nj_OOEr}=s7>5oH!ZDbf^y2O^bVT z+WYInELO9JC|wJ|0MPy>#;WDs@5$1Omm?jeW48u%5pP;7O~)dq{|f=_T#%LDv6E83 zz`Bgp)ztB`NP2PX1c`yWF>#F#a0A(ueiOpOc?A3x`6D*FkL?WP&mi$h<5oF?p42L@ zm0sf5x=k7g{E;8kdhfwh+e71(h>`;14}tUlTQ?*~@r+X!(uV`_*2I#Drsy-h-10qU zcsV>N#{pM*Wi#dA`3m}MxbLm({q7TmZNuA8)J!SdXQG(PwT=>;D^CoiE{s}-w<`YD zpL>v2a;P3=P|;=DZjyL|w5Z-Laoym0KDDZyi#qmqygW9~^~CJk=%Q$-llzlGevIqw znE;F+*cs6sy=C&waS&?wXTKc z&SGD7*Ml1uTtK9{FomXar^z{1!-rHw3$g5V`wWpc_qC~=a0A{Mn)TL~sY(Gz=YeaS TfQUalx)LF@jU%Gg%9r>L7XHs2 diff --git a/src/core/server/core_app/assets/favicons/mstile-150x150.png b/src/core/server/core_app/assets/favicons/mstile-150x150.png index b064558a1edaf90e48646952f136e6bfc481382e..32afe9a267e26aa7d95223b6b95a7f7993eb7e7c 100644 GIT binary patch literal 14138 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 literal 1853 zcmdUwSu`668-`=4N+y)ZRBg44Ee&FerA;ZNBq}9H8nyklYC}b3LIQ_WMXn93@vGf%!+$;C9*5@kkH=hM1r2A`YoTI^Fn z=_dcOT%OM?hn&Wu2s@FVz>;A1qP9)YHSrw_uDx?pzG45YL_0G4Ef!FlJB~!XSisdqCP4@T?)x$*ykg zlNV~Z_*x4UA)#A$2{wv zRA;k?QKv;J6UD|Yewq${e0X2&cvtw)#uubeA7hqMLueVoFCRmAqQVL@z1YM6M~Erh z_E_YQ%v}pKOn4GI{w`1Jt`29H2(x$3GBEW#P|mV{njt$Gstg}jnyjM(>Un9{MvvrvAdy7KjY)2 z_ogI^icf3&2lGluAD=*1Tdsmlj($zzG>hii^5=>8f9|l$NlBU0{!3DuZK*-6?Ai`6 z>vcj8O0|~vo0L-R0k1gp{)6N@Iiu9{0=|~#pNzPqc{smvt4Wc~{z)?fYzloxK524J zH+C`m21*q^>k(flmVq2Qe4;VYX_Xa$i(fdd`sS~!GqYYCbFUJJZBHT!TT^0e5!*cH z|3#C9FIf1^%;q$FsW-$utqF3Bro!o&bI@sORnv!(Qc0sN@QO-o|@sV7V1*wSD%3b%j{*A zOIQk=uu{>vPv@r0)={q@-m|x0Z%;k>h%i(e3$BEik5HlL3OhZ&r`z_rXC^B+r8ua2 zgzqpz=6u?|c!b@g+hbRXX6cU!rsJbY?MPqV`nqB?+gjem=j zt%lBitZa$)LbjIO?D-DQ+aJl#%DQ(g#;m#^MsY@08yjhIBb;U1J!RzuoQ zk75=e5FDEkps@2C%gjt+$S;?Azg+@|&Ct$K{iYMXTd%q-E5{*brRZ78^FwprkxTcS zAw@dW*Egszo{)yW@GHNpf%yJ^1v+gN>p~|A~@S;V-qN1u0zn zTSb1u=;GU}#Jyedk=|Ez%%8pH5r2)9zVIF;){<|6qyH#QHcPwVjbv}X{5TRrq(u2y z7+Pa!b9AK7qSrWtM3I9{qlW_A_;x9abzgnS{<^(h^P0ZTNooY>odUu21GU$k7lz@m z%Ra?cdhr~kxTe(?Nb+!VhszDRqwEaSH@3`H1tpp5V|hQy>ffJo&Tb!f5=xc6VSF34*D diff --git a/src/core/server/core_app/assets/favicons/mstile-310x150.png b/src/core/server/core_app/assets/favicons/mstile-310x150.png index d938be9ee0904a091083c9b90552bac06f16de9c..e6d3ee3cce9df2692e7d02beda7cadf42cfbb088 100644 GIT binary patch literal 3411 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 literal 2004 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 diff --git a/src/core/server/core_app/assets/favicons/mstile-70x70.png b/src/core/server/core_app/assets/favicons/mstile-70x70.png index 5155640f09769667081fe8f0232108fad5a22da5..0083278ceb1f40bb7ac98686b12797fc55327c29 100644 GIT binary patch literal 2807 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 literal 1331 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&Ee-GqaRt)<2R+#F_i-rDp=KpP ze!&cXez3k1;l5e$`jN8qmy6YD7W^Cw+dede*xubS(Npi_@~OtpX7GFB2-}1Ce4G;)Uhe(wbN}i=Pxx}?#U>6nINGs~QhHQquA z8b4aU@XM>L(&A_LFjZu97r7p@;XHFru*kQKE>?f{PICH?(XF#v?&BmA5tC)&DVwGj z-ORj^@}+3^Zas50??sl2y_U;%-$-F~)exH~(~x>~zd(1p(y}kPCq%W2b%N!DU2|UC z7OVO4d6VNzF^xkD@>lWYweNF$`Ap+MZ{9wIL)C>EM}LX8*M~L>-1p&Z4Ozky<@$K} zA5Xo5Zgcd@e*b7%vEXZjh_A~s<)G+<*_Y>*v~4)7TFhuXbF;zXo@wj?VtWGaJp8DW z*l@Dz=>@(=w}PtpdJeB=ne1aYnJM#+)bF+jhFkg`Ful0avSFo5xslTG4Z99rSu8(C z-_?ezBwgj)7hZ#vUk=O_yW!{bzLUL}b(O-SZOj}W-|McF&JIqDS(mUYh--De_{--T zt?VxNvirz-sm}F@F7Z~?4U;ap%oIF-lgIM&k`^=j8UOeE6K)GXb@|4e(s#2<#3xp_ z&#_GuQi(rnZqU2PP3E<8&;e09v+dT&%O`br$cr89*xhkcFWydh>aCLp%H~;dy(;~? zMbXT1?lhdA zy5q^StLJ^M2uR2HdL9wT{4#}e@zRFNb6EBi_g`0Add9``+Q9{uC7YSHw?^kOUb-#48FbRl$c7US8UxWxAeL5ncKfCg)b_$?h@Eq z)Y0E7(8Pj+6144 zs$E=aQ`TR1*{0jdBYTvW_tapw{U3R|Yq_v+u|7a^`Ur8_Tuo%mKqovrSu z>2@vE-eo7YP1bz!s)DWd`$Lt9iDFSykgX6w(8mTkYDK!7biv8fBU?t zv#Zj(UFjIl)T(Sr5oO)d5cm7#`a(xzZ9<$a_tfn>qx#D;cX7$)lNEJ2D_&04=3P4b z)Rco+KUW;+xFqW<8~Q=B*EDjW*2xFbvo|-r+M?kmRa$1Il_vFMMfUewnY?L?SzE!` d`CoB8qu;Hy)pvh$9RU_944$rjF6*2UngA?S#FPL4 diff --git a/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg b/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg index 5f8b7cfd8576..71f62271cac9 100644 --- a/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg +++ b/src/core/server/core_app/assets/favicons/safari-pinned-tab.svg @@ -1 +1,13 @@ - + + + + + + + + + diff --git a/src/core/server/core_app/assets/legacy_light_theme.css b/src/core/server/core_app/assets/legacy_light_theme.css index d4f6d10e7022..54b880044ed7 100644 --- a/src/core/server/core_app/assets/legacy_light_theme.css +++ b/src/core/server/core_app/assets/legacy_light_theme.css @@ -931,7 +931,8 @@ table th[class*="col-"] { .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, @@ -1050,7 +1051,8 @@ table th[class*="col-"] { transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { - border-color: #006BB4; + /* Wazuh's color palette */ + border-color: #3595F9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 107, 180, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 107, 180, 0.6); @@ -1493,7 +1495,8 @@ a.text-danger:focus { color: #e6e6e6; } .bg-info { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; } a.bg-info:hover, a.bg-info:focus { @@ -1609,9 +1612,10 @@ fieldset[disabled] a.btn { pointer-events: none; } .btn-default { + /* Wazuh's color palette */ color: #FFF; - background-color: #006BB4; - border-color: #006BB4; + background-color: #3595F9; + border-color: #3595F9; } .btn-default:focus, .btn-default.focus { @@ -1658,17 +1662,20 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #006BB4; - border-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; + border-color: #3595F9; } .btn-default .badge { - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; background-color: #FFF; } .btn-primary { + /* Wazuh's color palette */ color: #FFF; - background-color: #006BB4; - border-color: #006BB4; + background-color: #3595F9; + border-color: #3595F9; } .btn-primary:focus, .btn-primary.focus { @@ -1715,11 +1722,13 @@ fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { - background-color: #006BB4; - border-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; + border-color: #3595F9; } .btn-primary .badge { - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; background-color: #FFF; } .btn-xs { @@ -2401,7 +2410,8 @@ button.close { background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); @@ -2539,8 +2549,9 @@ button.list-group-item-success.active:focus { border-color: #FFF; } .list-group-item-info { + /* Wazuh's color palette */ color: #FFF; - background-color: #006BB4; + background-color: #3595F9; } a.list-group-item-info, button.list-group-item-info { @@ -2665,8 +2676,9 @@ button.list-group-item-danger.active:focus { .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + /* Wazuh's color palette */ background-color: #D3DAE6; - border-color: #006BB4; + border-color: #3595F9; } .nav .nav-divider { height: 1px; @@ -2759,8 +2771,9 @@ button.list-group-item-danger.active:focus { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + /* Wazuh's color palette */ color: #FFF; - background-color: #006BB4; + background-color: #3595F9; } .nav-stacked > li { float: none; @@ -2869,7 +2882,8 @@ button.list-group-item-danger.active:focus { color: #e6e6e6; } .alert-info { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; border-color: #004d81; color: #FFF; } @@ -3503,7 +3517,8 @@ select[multiple].input-group-sm > .input-group-addon { padding: 5px 15px; line-height: 1.42857143; text-decoration: none; - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; background-color: transparent; border: 1px solid transparent; margin-left: -1px; @@ -3524,7 +3539,8 @@ select[multiple].input-group-sm > .input-group-addon { .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; background-color: rgba(0, 0, 0, 0); border-color: transparent; } @@ -3643,7 +3659,8 @@ a.label:focus { display: none; } .label-default { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; } .label-default[href]:hover, .label-default[href]:focus { @@ -3664,7 +3681,8 @@ a.label:focus { background-color: #014a44; } .label-info { - background-color: #006BB4; + /* Wazuh's color palette */ + background-color: #3595F9; } .label-info[href]:hover, .label-info[href]:focus { @@ -3977,15 +3995,17 @@ a.label:focus { border-color: #004d81; } .panel-info > .panel-heading { + /* Wazuh's color palette */ color: #FFF; - background-color: #006BB4; + background-color: #3595F9; border-color: #004d81; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #004d81; } .panel-info > .panel-heading .badge { - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; background-color: #FFF; } .panel-info > .panel-footer + .panel-collapse > .panel-body { @@ -4305,7 +4325,8 @@ a.label:focus { } .text-info, .text-info:hover { - color: #006BB4; + /* Wazuh's color palette */ + color: #3595F9; } table .success, .table .success, @@ -4428,3 +4449,71 @@ input:focus { -webkit-box-shadow: none; box-shadow: none; } + +/* -------------------------------- WAZUH -------------------------------- */ +.wz-login { + background: url(./wazuh_login_bg.svg) !important; + width: 100% !important; + height: 100% !important; + background-size: cover !important; +} + +.login-wrapper { + text-align: center; + width: 430px!important; + top: 55px; + border-radius: 1px; + padding: 1em; +} + +#opensearch-dashboards-body > div > div.app-wrapper.hidden-chrome > div > div.application > div > ul > div.euiText.euiText--medium > div { + text-align: center; + padding-bottom: 10px; + color: #ffffff !important; + font-size: 35px !important; + font-weight: 300; +} + +#opensearch-dashboards-body > div > div.app-wrapper.hidden-chrome > div > div.application > div > ul > div.euiText.euiText--small > div { + text-align: center; + padding-bottom: 15px; + color: #ffffff !important; + font-size: 16px !important; +} + +#opensearch-dashboards-body > div > div.app-wrapper.hidden-chrome > div > div.application > div > ul > form { + padding: 16px; + box-shadow: 0 2px 2px -1px rgba(152, 162, 179, 0.3), 0 1px 5px -2px rgba(152, 162, 179, 0.3); + background-color: #FFF; + border: 1px solid #D3DAE6; + border-radius: 4px; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + margin-top: 32px; +} + +.loginWelcome__logo { + display: inline-block; + width: 80px; + height: 80px; + line-height: 80px; + text-align: center; + background-color: #FFF; + border-radius: 100%; + padding: 16px; + box-shadow: 0 6px 12px -1px rgba(152, 162, 179, 0.2), 0 4px 4px -1px rgba(152, 162, 179, 0.2), 0 2px 2px 0 rgba(152, 162, 179, 0.2); + margin-bottom: 32px; +} + +div.euiFormRow > div.euiFormRow__fieldWrapper > button { + background-color: #3595F9!important; + border-color: #3595F9!important; + color: #fff; +} + +.loginWelcome__logo { + background: url(./wazuh_logo_circle.svg) center center no-repeat !important; +} + +/* -------------------------------- WAZUH -------------------------------- */ diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner.svg b/src/core/server/core_app/assets/logos/opensearch_spinner.svg deleted file mode 100644 index 98c6f2af6189..000000000000 --- a/src/core/server/core_app/assets/logos/opensearch_spinner.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg b/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg deleted file mode 100644 index 8d2b16595121..000000000000 --- a/src/core/server/core_app/assets/logos/opensearch_spinner_on_dark.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg b/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg deleted file mode 100644 index 41ab3c960b94..000000000000 --- a/src/core/server/core_app/assets/logos/opensearch_spinner_on_light.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/core/server/core_app/assets/logos/spinner.gif b/src/core/server/core_app/assets/logos/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..de9446f345c623fc814170b89090dfda6974f1fd GIT binary patch literal 357492 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≫hY>;-qb?GKQAP#?20pY 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 KhBOEv=>0E%j(Q>h literal 0 HcmV?d00001 diff --git a/src/core/server/core_app/assets/logos/spinner_on_dark.gif b/src/core/server/core_app/assets/logos/spinner_on_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..bca3614c2fabef71e10a5a4acfe3c3dd09de4869 GIT binary patch literal 313690 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
EWXIn& zloIIzzL<0v*wvz|B+RS=u%U=29@+3TdGciG)%?p@Fq@-5L1bNb|enAn`8dXG5_Y6e{;iXVqG4yDD>(UNbACR)qeN^gv)T=_4G6LncH#f(#>R4(aE}uF z>Bh2Q;$!eR)(Y2te#DLV=K@pt&jsdf6T&p$0&^F*z|yMP{pv@lAC10O6B;tVrIh>)khphCKl$WvqHQ%6Y-6mz%T8 z0>3wBIYoVBa}Jf{a2N0)tus`F{oCp%0f67rKZoNKqNyzN%5cO-MQ{X)$6+W}Ksu4g zXZp^-d|Q`!a!=t%^|`z~(!i2sRvrAyPzfqycn-T(r!wPogg|9DiyomT+_xfyEltdY zu4dm^sMCMUKz=k3fOmbFmwiZk&W9#11?ig?>CIQur6$pGO@34L(j{z@gj5iVR@CFJzGqadM-CxsMh<#~iC|-_d%#sPrXxHxUO)Fe9U3oAo2dFe#}|*&as_uz zLccbqsU5UM7PY?!5;B8mKYFD+l0Gfd9uPkCb1SNDaR725Udw;eeJx$a)VV>_LTS9| zyE^K5%!mDY%JJ$ejxsNtIwk5PlAUeeo%7Is^-iKJ{)Ag^1@XCJ@$!Y9K*2s5_ybQ%w zPU5e5=RSAqw~Jmd0xL+O=T@wDMM zUn}#oXBx#;y0_=uJQzL_@1p$V3s!!QfS45~EpQ_y{4vD-HNA7Q8i>f{+}F)t4cFM< zwBcm*``cByCflcG9ew&b^x+A^%ygU%EvP$cQR7*z7)jgF8j653N)S&A8?5LZ+@bHivC`nXyfK{t>#jtptRa_`Jzi-lwZT(-vV&pl;_Sk?agk>B7B;JtI(Ecjf_i z_Dz5^_cBG_X9W{w(C#QTz><4lG-8*Fv)nWyIp7VWuN?H6$XsoB{5oLUoMBe6#Nu4) zHXSqX6KDG;B)h``Y05M(~gGR-k0Gp+k} z=WQg8E8}tqY!5FC4_;W05l(B10l#>ElSQQ zk!OpEb38?XZUw<`)moy$ir=~uZ|J>OZgDsj*aZD)nHJvC?{G|68 z)d4lxIW_x1A%mv>nat@%MkG_iFbEW; zEGNmBo<6JYa`z`zI4}FVK1nvtT%Rc{m#QZQqu6eoaQ%VIa`%HB^sn$6f zE8N_vF(1U_c&1kJ{1;a~=RZK`6h;2Nxnye*dyEgBLE+(y5q@FU%yskRe3wf%C2#^b z+{?1A=h`xt2FE$G7-qa`SmEGQQuCiCz$Ma*Q8>Z8#;2P~+~h#rg6=4W%q8c=7wcmzngHZfyFu7tX03Eq_q1p)qb*PO#BOUkix|Ue(mimIoTL}oMRm1 zhIk_GEt3)XRqpcJu#a4d2}Wt>;AiL;pW%SI{M|5I5>;T{NP+Y zczU)hVPpAPddTRtwS!v450G|57?mF2&Ma>)y2gFj{=;s+y1|BqQg*^s+k{ ze6%Vx?oBP;&0P)KU|>&HFR@B)wC!5oq|8M^UQWX&s&6tz4X78GX!5@M&lya!@{C$q zij?*~V+Jjo_bdrI>UE<1)gpg7*3^BdzagR%KL^BoQ7aAV_#VQoem6ZU^y()y8ANZd z=9VLta4i-wx(oVqt!>y9Ua|m&rJE4*E_>?FS_P(7W}u|Po+)RC_h>U#4%+3GNppM*VLAEZrC<8>xz1WT%KQc%$0lz5DG63kNvh5kom)l zB=S?e!D_N+2ie9v{x40A^?dQNR_B`HswG>$3A-mC&u=B8kJoNmuhmnnq78Aa>Myt& zADv6ojnOepkylz+bDR4lhXUu94dO3VYj9E>dkvzK-0dq!HNWhv(*!XNsADyVf>u84H`S8Jy4sD_R9=N0B>!IsuS)E@J0_`>1*BZO>i z*Y?MZ#Z9`S16Ulf!SW=lE+4?7I!_J^_8ab!Gad~SQurZ!Jx7e~WhPxp`m&J?2C6sa zL_IiZ%soAkCS7LJLsjitVMVJ;?&q(|?`1u};zCGLQ6uih4J^`cXUloabj6>x2JF4n z6JkD{K_+dR`7<*rAE1_=rTaFk<$uP8SwS#_0AfDewSe+Q6-QhvKEm}9(30&e>g0_v zcx^ z13fxm2>=k2Z10)3tZ847-?&7hYdhiFb>%H(oyc+DMxL@2D&n5kwBBAv*CTP%i0b=` z)hd!@`D&z9h5HJ~EUvYcm4jc0z0T@CvJH>i;O6cCmx}pIKkDW58|+@u(OP!A5U6tx z3%b#W4oVzkY@%)YGC4qXydoqz1>0_n$YMsD;?+OcO$jezO34pg79mP~7dnv=uEIYP zzVWm%LXkVPKaXIw5Kr%%xaMmZW{`URo4R~{;_IN$lZ&N{2P03U9_?>sKAwoyKo*JI ze?G_b=KEE(>H;xe;WwpU-#*Ov`6;I<0%qM-iGEvLC<$a@(r>G5x27MtRz@md`#Qhe zYZPdj`iecNyjD6l>$H&Ira`4Ymcw{nBmKI{rgbhLV2Ht@OJFZA8cL+eapIigN>3bP zv_J(e{TOP*eXpA$?xT7fNId%RB*>rBV#pbPHZUU3Ij-PJI6Q}(958GO>j5LPpDmmN z*v!bbV_q3+R6wcuyUozm0<=7#;{QgPvP5x#bIuO&A-5dD#s~0~i6aS#oZh?o(=8;_ z=dz}`(z~iE+aD;L{f;!#gMCiA^fd@g;@7qJw(u@!IY=tvS*D;d8^WGE(FWVJP6g0W zPP@`+hk^uXd@YoITLRQgVyUk7umZ35BtFcHvmy&#y&idEf$6{rn$jKZF^l!d0%^EG zth(?;YRq-5hlT19aV*qf8k1I^0k28Ci4G_#Q}Rk$5>wP~$}B;%7jOf|k)pN;Ie;=- zfF|tsq~$$xl0%pnP?(L0L;FPjGJ^dYR2v8gRCj_;u34(mDHw!=W!_Ee1VC~aFPx5J z4W{;@hIyznDT2c^b}fA~mN@`T&<(nwB9Ym6C2WBw0|U}{O`DN0z}wx=4>RG&6oDso z-}#142lSejkjy?mIT$+Ai3h$k6<=?j&Gtua@;)oCM)=kcfe?l^mx79dm-047_v%hU zc08n>I9Xy)hF_YQ);OM6UTS-1EPBT~g3*>^^A`T-T)gHYYfyCUdpZU|(ZLgKm8%nLEg=oO&)Sa>Q!!wtp z3p=GXB5BjTS_|EOw`I4kU;}56C5G)Ka;Ugm3F-h>R{I_F4HEzIoxU6mzqNOMaB=4Ck; za%Xro+$ky~!iX!}iUeg)jB#bWJCKaLing0%QdYQYp-4);NY_R2hyF$1Fy$(wNTslh zyDdeWai!q9MLMWJX)DAMZFRJCwW3U=n|qb*8cp2uYNDeWHL$je6(@wR2Be{t*is8r zWo2+{FB~s-e3a3 zyFcPUPj(8Uv+=tpD_mPKdb#^U%Xd?dw?JLwKSoRx+27rtzctyvHQB#4*}pZ}onJn* zqmLbKL=N`8!IBSOxf-*C|Nk^%KF!E8iVjw;Dzu`n)o&F^ub`UqD*A|Dx#M}IX}ogx z_;i3Sp+y2lHK9@B_|IZ&&F{t7J>&n%D>)8;NEBF%<<@-)6m9W9F>*Ipan75S(%N{I zgxV;^^55?BG!RrZq*D>_dABHssBVeALB0wn%#|U|bj9P6F$yK^!@@2Lv3_uvyRjh* zX~~A)C8l*Ffigy3m`h5}zHi7h8(CQNT+H#jJjD30hFTs67sLLNt4P(wxO*K4i`gMXD?W?fbHi3~O)uvS4xI7*j(S2d z_d6Eab5X4m9i>m|l#JjQW~Qlh0X?)SErTU$^w6#i`!LT-Bpl}hudmkq;{3?ZrrIxG zwA3l`2nl>5#UEOtZZ(zvNL4Ny2c(!yQPlLVzqXcNe>H(P2vUFB_n0`<(y_ykJ(RZm z0bbi5z>Gb7pmY8Ey{GQxPCOmgp0R9eu!T~k8HoAB`8&RC%Jv}q*io0n`@J|@JEWho z+cVzxe64w>)BdDmJdr$TVVpqX<+y}5cVL48rK48Q!->6;K7NPWjySmdNlk&YlB4ui zT!Tzh0(w;vZ#!o*9~;?!b|Q(mN7b}Fu)5!h|F&?maFABE<7Kj>to1M`Eok)BuaP|I zB4@uP*8VT1!n&c1)*`^=F7*oLYhTgIj^})B2kINv2rckf`oyAK^0+0o+r~+LhT1du zSgg#K5AxI5 zOf#O6?k{2njK>myr#Yem5or;z6z`O#7*55?UJJBJrNE!fe>X&v|5|KI@+^$cUP_ghKCL7q+;-!dXZPIF+-%KtJ4IPX4#L7$)feKFf`ZMy^|C9h=ACK%pFit1J;u}Q z47@Le(6*Z@;BUlx=r}59N0&lBmoZqL?;o?}d?5QIg0KZa)Msbi1v16S1p!(jzOanm z^sOW@`!|$peD7M`C|{grE`Py;+^XIz?A*G~k3D&_?Q+tldynO{uaB{SV+0Q=EVLE( z-VXS_)w9=6LtfOTefpdQnP(jcxX!;S{GP_N7ahT`Ku{7CM`=l@fIX`*c-3fwVJf&u zTi3A{^&N=hKMH?)PCcS<_>^(`3%2_d(X&c(m4^9krF%%gqTUgjheq(j9CVgnIHWK< z;R%V2%++(m;4V3NLL}pI$I5u~vD^N!^NpQnDW^j`(U|=X z|B!OVgAKgawf4cNV~oy8CsFOhe1Fm5S^6&a-A&mId}_C`7f}r~-sRlRY~0aLXbmXd zSR8T$h(m8D%v*QI#r$xI-Q-d~wg?@ajTRL)pgOmZNylk>+v#gqQ1~WKgwdSyrV!21uxlf=~QQs3+l3 zyv%}sGOZGcXsl*eV$4h&(b4ToT_!~gs4Gf*A$~VFX3pZC<+cRLejE!q^gd4_iGMZ=>w3)J2Ayy%9j_IO+ZK12?{#Bod)JBk@Arz3@Jc_d$fnk zxa#mx3Twga%T*E#(Ol(pSpG@`d~Z$9ATR!*h>a2=rudWqTEpyjdb_k6F9*$@($CJ! zA(}a?2ms|nAhuLWT5d7-1bHZfQrbgc<3Mcbm~=uOsGbX*TuWx(Hh*cF8tt3fMV{0` z9GnPB*xXBW?I(Hq(ILXgHZ~^p8JKO;G=6zHO@~Vod}LJt)&0OD`=Tpt)-Ro%P5P21 zePMbCSlzaA@-XvUrSXKXTs$c37f65UcKk__O1@?$aC>=^KBGr6OSvz>$~g0KOV+`E zBP8;bW=b-e^j=;%t|1)k3v+)-;p;%o1DEh?Nde9;mFRO-;8_m)*+4;dB`fETw}gKu zNdeGAPe`M za~0N$USkpngArP$dE#>+^}GyZxy57}$QN#fByi?6VBY5?>XVy3^$u2oh_Z;ACXbXI z=>jK)1XHEB6-Bd^;WMau!4q*F-Tgs#_lK(m5df5iWyRHHA$X<3m~yx6G90a}8+>^m zE%Pgg?O1@!GPb;us}v1MzTZ<0++G^eSNsH3%;0OAop`1EW=a7oTr3ZYsZLsiq2z?5 z!fQK!x`%0?*7x*;vWc>!ny!lDW5pe98x1Rv)@ao@Pl}#QF;I=YpqF#f&Zus$&Yr1; zo&={G)A=ye`qfc7qaeB?)t;mlz6}2NwCDnXAz5~}SYUY_5M}!3JkX}=ACZh-LZ_dj z>6N{8=;_@mDYSMdr*9JL{+^P(Y{rUUvdD8?Efs;=OEiL%xLli%bWB>1O#{LJf<$uVO5pj_OaM84f{ixr< z%RwD_aX@%kzX1p@$MJW`T>;^x@EMmLt#=M2>RJu~5rD^i1f!i{v?dZ{n~Z1IWv#hVbOd9Z_Q~||OlfJ4 zJIbzYXW3M9v{G&i=e(g3oZ~*1QSs&>ZAiYHS=qvk=VpzW@=91^5&@J?Al|^I8bsr+ zMM<_<<+Gj&g$sLdHCz6jlImCpEn{u1%5euCLcmoTG5>JT7;=*gc{8!j;CBc15UrR- zItlyUNyz!+p*z9%rH?FSbw9AE?d)0D!1ycf< zLmWKR*u9aY-TWg{A(!Bt@=wL7T$U4hpeKw=GJaB$)y^JPX&(2Ou7e@t&fh#r`57i9 zQ}5q6WY6+rG-@90s{NUEGjMG0T^lODSMv=f*1&^)o{z4zMFIh1RDaiR8&ZPA?96D& z-IK+o?iKys9OLH68WeRpzy$sVr)`iM9po$lyZPR+h@f&?p%j#8_caBd-4}qL42f~9 zM+RSWxW*AO?C0D(%mZYVf=GUiS3_B@%bR$#Vx#B9tst+m4f0^=76o&`3{E=-VI8w^ zbLagedH8&j72#7|zgFz$H5)$gsv53Y=e`w|#0l>~C?V{lQt7X2W=bYQjUD@Z-Agvs z<8e#Q-m5&7ftov7^^$!-jRB!|iZ|qC?PiMfV{nS9HAub%@PJkXacR#<{R?~pG7OwD9D~6$a1a{O&sSxd`7uLy|Rcm zOW0Pcs5h$eNwU^gGVs1z+`YxD$AgWH%8$I-zsfm=E%jW81+)#x-9PA<{b+s#&313` z^jG0S)4At;Mxl0)VAHkE3%?gzddxU3$J%7YEHZs6 zOcCE9Dh+!X_R6iSa3${UYnNf3!h3b~2H*Q#&i#2m zk7}MshrXstFc5r>b-6fRNE`HhxEG)pd+&=zP-_5LoK)1}mW@!NFI`-Ox(3sSp$7>^ zj9bvClX)ftk;YJ>%|%{}hg0BFT5g^W<6?EQ;7f`*>lWzL0MMwKQ2 zS^5C=SFI#s!M)&=nKsxMtu1ML>~#V+^{RwPR?%2mg~)}_(c#oWp0GLB6#rqZ%`E7> zZj$FTlEAQ!W2dw|jCox(epys^1fuTn(p14TrK$kt$`-K&6YT}Ne>3B}gv%CK)B=pD zo3EEGLv25q-Sj4o8z~+JwnQH9NS8rSdkL4V-O1MqvQ+G{V6DI5(m1FT5we3$SL^o} z&Vu{4{zH~Ra0%`Ky=;+O;PjGZB(2m3#1B^dgOwsZ*hDd2y?Z=Kz-(-eY4*$Z|ACc| z`7mjAjfK{{%T6qAz6@`q5ic~Ui-~oSi^nvC1c)j{^L33=4=W0)H!~kM(*^frK%tq& z^abX9Y37zjU9mYV;QX~iT0Ro7IbtNOmOc+$mytL54^x6&ka^wm6>j22k%_gQd4RJkQ;rCY9jhxVpr{`zUEK5>G{qDtp`#JOb5!{a+~&gxxfnTz-c2Q9=K zSA-9*iS1-U$_NL6bliZnknDTA)czvqdcpY&)Ty=5ryG^pfpqoD)I4O8rn^m6RqR?D zJ%TC1VJlGpMt#2L&qJ{#Oi0@fD1vUQm=aF>w4>latF)Bsk}1#O={P9FQ>us`=HB+m z0)Q!_E}63ACq!_Qml7FT@^D8v61PyyJX55$yc&;#?mUaAF1BJS6AfrEn@c|;OMfnw z>Oczm+06NN$)+YNXnl$^N6ND;%N1I4pd`hT=Y`66_HPHm1`cJk_|jGCP=;h+x7nKiGXKz$f`BXbv{L7S92KtNDo?(%`k79hRYFpW5%m~q^ zAVczm5&6Fn8MYcBdB_s zRCryWfOaUqx4Aj72TtAJD(v4X?EgEeu>X%T<%pIssb10}Sk13V@QZPQtk`8_712|Y zJ{CF?Y+;S?nj_!HxZbNZB#R!KN@1c-iQ*g8eRcnQMsYw%L__FAcjm6cly@5X#nmK(0sa9W3vuXGLpiFemJaE(Tf2O@Xg}W znTad2tl@d+^>hB$j%FOk4LjcTr3g`7zXqj*u z_If9iU^LD=%=pg>`FA&Ng?zx=J6oS-0CzU|;_c!R>MRjZ9XDrwV6{dv=#&dm)umTp z6hu1W*_T8rFZy|v*x8mDV%j^R$(7uo9_A4)K3eYm4!_ z-PrKQDuWrH#4j8s^{@IKotU-6mN7bBb-dEcEaVlV*4g|qo9YRjnOCM8+r#jR>Lh`5 zQhrWP)*mhlgW=VCIXb$O1e>7V4QGol&2bZ;59~rW&ApQ|Fa{jYEJoJbaZ_vM?y|KO z5O%dQL7Q}!))}t7*sAM&rORc8zw zXpi&?7>0ipIWUu`z|>pox}Hqji8{ow`Q<*-N%HcOU|v`$if_!2(WY1^FUyPST_c{= ztrsQ2Ef#NGbhLjEwz*KW-H*iC@T+F___b#g9Tc3dRi_~qi6gK{d+)1>(~^qLqGUqR+p-~ zuS#Oz%=<_BhIv4bY@J(r+ar6H*Db~T6ZeSYX^s+cRk z`}wmn^L(z^P6zTqG&b#1zpn2+wg2?7!$N9fEGZmMiRB^o^ylgup$G3~hYmqg)PnDx z3SMvAHhHEY7yC#dVwv7LQ0v>~RNH5CwWVMq{1LDH6d8w3hw8QCH1lcUvObvZ6a`4M;=qpHYY7YQ)u)MOJP3 zssx%t_T)=$USj3?ybghJ=)F7xd^3$sjrdy&ez`;8ZNkw!+d<0I<~0(g0-E9Y4o;@I zVU}A;x+lTclbF}r<7ruATFdk$%-x4v;slhUdGJluz@{s)cYz)(R*Ln$)PrvaQJ2YO zT-Z-Z0-+%%W3WtPf6Ss(Sbq+y@HTlAF-U45ew9X}RM;?xQ}(L_6jH#52#CA~)4jVb zA=FKBXFj1-DUt#wJU~fi3#!5Y!2fliZCZ9aOt+YEprl z(n7)KtU*wV4s9irP_IdLmxTL^2P5~Ox7L&SS(9a2H81C55B?1Nr1-Vq_;fR85W{0! z{jV?RZ%jo113!M6Ogh}bNoZ}S%J}z=u-?<#b0LgBt9YI;h%92Y6A)W={G|&sZ=3d4R*Gyt{{@(XkVN%L zIaCNINf}QzZ9e0zIp-fa2|ijF4$k}|C+Xey>)W=xF0HYJCf&@-KtVzqW-eWrARxRf zzub=1Kg%_g#>N){1yGZuf3{=Wa?;H+9)eXnc%*Z3Gq1N(s{dPv-F1zU_J^^&kNZ=I zb>}VU8Oj^^nD@Ri`!!)kJdp^HTzZXgOrG9JwA7{tlFKaCFW`{n;h+_;q2YEgltkS6 zG#|ePoT9}Ack@6=t4OM4AA*q6;>sRi=a&Hx1VXG72`b(}GSZ{iq*2#+;Sq}k9Ra3! zy#DRqG(ImJsorf=O))2gYF$B|WVZ8Gr^*byqV8e1}4QEJ#04$g??zk+;CFtB-rO}ejgmT)Y;$zJ!5@^-=p^U;lvBXgob!Ns!b_MF7GM%^V z?xSKkOf?GueH?DZbFo@;aBVS0a!0v_z?=@SV8+x@23Q$bE|z(o--wopj*>wGpxLm4 z_GO@&s;mV9&b4i;bkyZ)Y#HG1{+(Q!?@&$v7EH_E(WNBNhTX$t?d5VA6+nGztLlg# zTGW-hH}1F0R=Ddo_!tV$>y20e`K9@(7%*Rcerk-Zi4CK>w9X$*P@4)(STM6n; z``?lgDyzn6jz@c+Hr?KwYQP=bI=+1nA~zVcxl*Z%bCC8OSCmomd&TVI{GB@#pGHtQ z3TZ739XYziGVvc8Y5S>8(_{Bi)}M|_y*T`GKWKx(pur9if9>L%e~RT@a*f11egz-D zyK*nD1RwW*Poqq*XR^n`LkEGMyMV9K1BRGG#QEpF5cYu8@JGf^Ku%2_{x<70DLVtY zHD7U^Je~VkdZMl$duBg=?3m)-V>&G1mYLWf=sXx&XV>;zP_S!L{I$iP;xZ97;NtB( z4kL<-Ml z=!qw*a8u5dW0Y9UM5>F?vN;Zl^WX?CEw8d>RCJKgqDtq3Goz7zay_846pj4EX5DJq z{_(Jgchcj&HEpS>IwnbKu*%koaC(djqj05Y?Y83F-0D($@&jSW^?>DNB08P}{a
Nil=6 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 literal 0 HcmV?d00001 diff --git a/src/core/server/core_app/assets/logos/spinner_on_light.gif b/src/core/server/core_app/assets/logos/spinner_on_light.gif new file mode 100644 index 0000000000000000000000000000000000000000..de9446f345c623fc814170b89090dfda6974f1fd GIT binary patch literal 357492 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≫hY>;-qb?GKQAP#?20pY zOiYQ8F!02dNR1)>|Vr3M`3R2-NSnK7pYS7j7{)3W31lcPOBGDMA@T;;uE zQ3N`xcGJCKDuYofu3L0z?|{IDK%D^_9Zx1iS{-ew{D?No0~1)W4|)jwDnmH3kyPb8a*;;MEN`BJ`Z=)7l&D z;hADTkwj=6Cg78xD+7EI`q_e_F^Kq$rUyBVBkaxjDe)wRG!L?>SH7UMmKfPrk0zTm z?Ca8xz(v4#gTFu@)U2IYPxP$?h=)w+b8J#I0aQZWR~4WVR@4f+b_hF;yEb^ds+|y5 zJk|G993Y9O*F`amcR|+-wU9munP64rc8}$!n%{&hmRiM87ZP#Qx(WBNHUK1nmg`~I zOfAU9geM6gi4Z*PLn@{S)P+QgeHR{3Gzn^1t8O{f7N4l;_GK#q#v9mQH@$d15;@tl@ z-e|D#^Rllm z1tS1!_ub29&#taOn5=6cjNJ54J~G4($jgm#?azh8p9=|&KNk{zE+qbaA@RQ>62wH0 z{~GzfClczK$ZLxFz*FFwLgJTn`A_~{zg~hzhiEkIC zI}2BNMfdKS{a!U)X>G)Zbn|nuHgN(43RmUlBp8(!pS-_-mMaY=~#{J!7^i8`&<@>Cp1H!g9YBW2#J zdMeG~6e_qnqX+HX#%y^R=@w(HQoZ<&-vYcAitvy7M~!Ga+PeDa$4;IJncG<>d|r|w zY!|{@n6eLo*CxkhJd?hzVK7Lw@cu6c?}O+HCGOPcg>!S5w6yzTEQT+7>I)$2DntW^3YX-(J;Zz%$#?A zGsR}VK?4@z?DHiSA*{wxH_pQ-OX zl)kO~E`Qd2Ue!)Vs0Jfp7z z8>)^7Nh9p6XI+E$t{hpl)><>J_!5z45#oB@{zBsV+60R8SP!3TUOzc-;r3D^~z3OhFZ{n*4lY~G_Wtl9}0p4 zJ|sHa!rm%vuCCU;OQS(jYqmb4 zX1cHS(807@0EM9QD&29oOuwF~4H`tbEqB{&rmeZpwQMX3154fg<<|lqDEJn>2cs`K zf}I_Zw-Lbs!Glm_Sp(!p+A6xb&5>kHI!+d%d=a{*=Au*)WRDr@vKex#-M^CF!KN}? zJJFYgg7Lx{MIk~h1U+rMSs64I@cpp$#rX}46l~tfc#nnJ+PX)EURa~e`#tAz)Phf04i_%zle42G}{q9`{lYf1!?pC7T=C@Pf*-dOeT#8&Ciz=B-A z+*KeMWqn7=ctjyfAWT33;E1`XkqA`mQ&M**l1%JN5@5zrLMJIRFnu^#W=#jEY(yTXk?6^jY-uYspr9fYCG6fIAe`yfbS9Lui2pS>1S=S(eE9$u2cnr3 z=&Z;JTu3~QL|#aI9L^x=@R)$<_p|yx0coD@%1X{GPbyQvm?cOGXvzO);{ zNFsi1S0@B9tl)%WE0&MDr;Rwtr*TBRfzV}QB`jKoGG{Pp`Dsd|5@hA@xXUS2<>Vx3 zI}+wPkrvS8ekC|U;Wbi z3vh;okZ#LYB_C%PSa8DxH;Ucmv+X6aG`_mhb-JZ^WTTgs2BO@Sbk$GHZeK&75*s!E ziE^T&gb=&7u1=JQ*EMvLxsgt)jt?TIbUIGUek|O3IEL^`j;XHsW@(d z()JEPZxo6u_hivPPp7DgYs^dTGuBN?*G!o?a zX?EhbN$G#kFE+c;sCvx)utU_6N(=+Ykr>{?iGeKRs-F4O9|Zk!NqAn|mFK(maQ{&X zajCaklLizK-_#^#-$)eQsL3AB6=SXyT$qA}EPj?mXQ@G2uim1ygr0(P0UR-#uRq=7 za@uqfVlkr6v1{-YU=gZ0$O{Scu7}g22-**_&!c4&J0Z@?rmh@vAo$ZTMKs-A5bjSF z5$dZp#DK)cw_?3}Wq?a!%uw7@q;7n<8_hs#|ENCIr(KRN>6&v7P}x|BDJyy14Tvp~ zItjd9LwmpdhPEe4JxU7_vzonF3{?0-MZpph)<@i5VhWXU%da~(P|Z>XOPUnj?FHH| z=Z1YiWy4VWKW&tT&Zj`)Kk{$JpTXi`+(^KkaRI|x^3Mw8qpUm zk9E(IYcWdwyXm>0c}}k7OxNOyYI=eeg2PV>kxfs=uGt#MFgm^j+(sTRXg~pYAc$G! zJU4~o#3q35$Kl((Ysb(HRxOl;lo)VS%zAY+H_j%1&|2fQA(Q;w}j_HL5Zr*BHls z=+QDbEj_h}Ezy$}*AlwuB7n3;48(t!H$T6o8(^IIMCdk0)pZ)mam8{j&F9MXgT#8+ zjWb%j0wk3TdVn=xJNc}P5;`Jo?+#8w9MDKAdJ4t8OEn;=&MvY zNBC^u`kO{6R|Ms+B$Xv94#YlDwta7dAg38nexjRzH6kvf0hnfBz4fyt#Og!0riK+x z`5?qmO3S#A&(8s+CC`j)VZE4#J*l?cn*pXocWM(rX&DA6EhPb^?9tRR_hVdLhU=yvnW0g)^zkg?!)=qbZ#q;yzUNlSkE#J-iR=UqE|9TIK1mS)h5y=ea zx_TpaDz-c9B1~4~?oJ$YB3R@<*#XexR8-&;gK4{;GV6M1AI zzyOX=18{`a+5t@P)gU1lx0EE0`BtSSdM_+ZNc`Hs({HOsv}VKvotdq(Uw^DDzN(l1 zfpCf_UB`MYsm5KTR+H{ zD_Jcm5zJk=TJ;FwE5L5a@ZBEo`SzolS^yTnqOp5g+J&WW~pG< zhH?;xr{r?Z!ykRR@!l(w)9Bsdo?tp_V4)Em?ow#xz%y@F?coyvaSd<7#2fUvN@O;D zE$^Qa;VP$P-;ag4oZ-9L2G;d7_{-X-eTMbO9NG6|1r{1ifzd8DF{9LS*1j=hzVo`? z-#oo(cLT4;;kXqR>HYF+k^#U%BiNHu&@43PNDsn;8fiEOtbjsppF_!6F)lnAzItN3 zSqNNcQ^STj;$}D^FCtt6g86=dh-<(_#Hn*q#6#{~7o|SrMTFs)rICW~_k|Es)^Lme zkG;3>in{;zc4vTL2vI~Dr6r|nD5Xn8ngNuK0i?TU$f3JIy1PpdkhVZTLQxcfAyib5 z(AzoR0lk0sZ=ZeEdiFkNpY^O~@lSl$`d**weZBk~HeZ5;6@57np}#LQ2y8^52yZl_ zwo#jc3 z9E(r|ScJD@2A9x*O=KvC3$@(I&}VtPl}fxlp=}v$?9LFl_-euvDm7maIr zM;Lf5{;pp5(4m)XL}D&nN*n{B8n|7G_V)y)HvA03;IY5gIi^x7sFDCEvDV2kJx>>S zvio@nfD$9gqxN19AR)nGRqMTd6*y-} z)NEotjj>!aB8rhrErZyB0N5x6?1+*a$!t2O8^q~))hQO6?5GZ@%LdsLmx5<9V}NhP z5^G%Y2am1@=a_1^wnc`=M6R1ffFTD&bDcv?52Ci2+)u2>GVkbQoY+jD@{aaqFtNPI z1ggI@xY`){^aM&I*j{w9Kd~d&Q=k#i7&^Ab1(t;J`=!L$A7~*%i`m1*`L#AMp40Q9FvhNE^N{o3&{)$z}d!&5^8&qBmYpEW8t9ALNbyPQjhQkNx9px_BcU8zl5Q*sLdD`xI7gk ze(!$%5hSV{N_A6<6-Hu1cuJe~Q~phm2q>$bg+IGUjT0nHs?(%ygEan)OL%*W1vnN5 zO%fL5oR{b>Ww)_>*scCImq<7cvhv1p2`nCuKL9400Y~CpMl(FR+@#dRB%h!r+s4QU zNJ!++%bQ#Os1uPax&X6poZcQ%zd)^Imc6#MF7InZg>$J6Y;Hq zeWo^-qmeJ;f@nbC`yN6%9+1g^)i8u`Os#HE(fMN~Y#!MCEUv9@VfH09za*LeghxgG zByic$P4IlR;ZQ-bYbp1;l;j=>WNNZ0qlK9vwsEDWa>67Za3tdP?>BZ^0*-`lmy|<~ zB(XH)s;Tt(ILKH{Bi}0)+1cMvB7$C;AgurpBwpu=OG`sYw_!I(+m1AhjWoDcx=Ki? z(%*E&rCGHA9SLmpaocok6I)z96Em(N@g)Z$U)%nJ2W8>ZFv4k9E7{7p_FIs!XHeVR zg6VB5J8W~Pw?RAuAxs$PP*bjiy5H(5=)$(nrx(p>qFvflEiYO+GUY2={t$_TJhXQ& z;X6Q(c%SFX3s!k$VSN*Kvyty)e_y&WixL?9?0|-=$=6UCZ+DsA8VB>L7k&fK? zD~?FmFJu)3Dc?1&~ton$Hdri!n?-#?v8?YZ(A)D5}+7z zM41d>WXwh2%U!uA;mV+Y3s?I5D_q%7j%Ak*{#~xj{%ALqV>U%u1ZFtd0Wtpt?0~Q! z8Y@wJ5(+@XGBcy~Bw~56@KmFvLl;v&QKGSI?s%X?vtB?%PLBMQyD$uv z8$kH0-Xc=>3|cXE_H|t{6Leo-5LSNV&s$es8wR{tG`vb!#((`?hS{>4Ovq6!=sm{| zqY;i_ge0HO^0mnIo+V36F*<;t=uPaHiNa17`%j%L2bS^Vzv`opcwQgwxwUA@4}=u# z*pM+Z8$p-_`pyS(;ZJDju_)anr<3UkT%Xe-`9$c_o(v)h%3zYb-WvWY=!RHcnnKl2 zg&crPTu9G;=5-#4#PS}>b&e8_s;PsVR5{lc#5DjrVlBIy_{5GtaFhUcM9r?SpG_fZ?Qc6mt}Z4aD}6XfA7@9bbnHZrk%%w0Y-KkuaVy@FEKiqeWaU~9d4-5d-mpW&w(00O<1P2Sw7j6%xrh8Zw#yhTYE?x z-1Q}IJ7Y~^FRC+bNtIJKhxD01Wz?%puMxf3$YccT&B-kzR}WCU?3d%kkpj4ASj|l{ zf&_;1<#wHymWY|6h_r!dL|sk5a)Srk*W5D8s=yvw^udGD?9V{Uu`lLFy?>fEzua3H z{TTjtBQqY4Tu0sNv!A(jwch!ZqxyYWHuOD6v<|Oop{*LI5g_RN@#*FBV-^(;J$e3pOkGXwT{@26JTW!SE&pv-d`jbBHsbBp9Z2gb>0 zcPD0I@a}w9Xn3^{%$jWaJ-s|om;mfK8b~kbcr8;`5)dSY?um*_Ydg(j{j4 zJV@~ZaXBz$+p$z#=Nk)t%IUe{3w|HXe?-W*0ca9}e#;!*1excP3_!ytn#5M81^t50 z-V2m~cd&wAgvxH{oKcutL>LbSJlcL8T@n(;c5h(Hrsy$V1R`|^mH1VU; zcrls)fr!wDa*!v7k#jm;jl3t29XfWBvsCf%%v+cIS%EM|Sf6qU%)U=twxqIJ7~VJ~ z*$Vn&6mm=iLAx7)1kN;&(X+~NkSP18Q6KDJOSlXsx(kl70?ssMPR=ys+?5Hr9lByQ z!C)3`_iZE^_R}l$Vv+TMO(K_Xywke$ zb67<4Ab7Ie{I7j;AUQE@z&lRuldlpEh9ulw4Ier5kWEi4@{1>yB%o?adb3=zK+|*~>DEVtGjoQ{4nmLAH1|ic$gW0B zs#+RS#NMbvo6>me`DU?p1)EM}4_c&ZDIls?a+WB~!Z))!yyeWfoc?0VP&ruvEt$|V zsdgY#=Msbpr*>xNMZ`a?@Lx{W%1X~#{2pmi$w$R$S-a?*zMeak#ame&T3s#JvdJ4b zaWc6vkbZtsCt)oHGaa*>Y~Yd{pu}zjz4ozB`q7S)CqCNE~w z#^lm35_TW49%mM9OpuwL5(zmI-0FsIaU)Gp^FdKiCXPrb@hI}WFX`oi(Dp$7+AMtC zt~DcBQV5IEYLVADjao*OFr*cAbXx#K!UfPIl*&=>PbN1kDy)Xe4Rd3~Co`dx;|w0FKBEsLqhOjYt1)lN$h$Fbc4vcZBjeL|zKG-z%w=w8i*0 zk!U6few}W$g)($fK9x4!Ad~A^ea&AnNa^ zWm+A$t4{YT*eK^bFaa9w7{!`e?p8sKz5D5?oX6r!+ z;UuDNuoZ#bgzW=FVz9Qbg?XadO>DC9*&iZdo=fojTLWLXOBW=6x2H*$x&Hi*dcu|B zqk&3F>C*N#vd$Lx7rGKFPn;&9-z~*WC&O;qa zYLYF{fiiZ-fA&A8y2|Goodxgj1!O;d#Hhw=nP%1c$(`Fns7qV9{RKtOi6hb5*$Yyv zp)}1auH(H55Q!(IvZ2)#PZ|1}^7OYXoAkf&v{R*=Yr@Tbz5@0(DEr<^_kS?$U%%Ne z8V3VTHg4mU=bW5uP@bM_oJK8EA8L|t0DBvZwekflw3}4)8@vw{CLWSJ7&v#11~}P3 z0)rcWM=k#{r3(EAlxU0n&rUXqe?y6pQ%53YQ24($wsCpX>f9NWID-;rP~r?qoI!~* zDDl5Nl$afP8C&tsMubp}{z<43Xhi6rHX;l&O*{%5O=WorOznu$cPPNnDCs*F(vuhZZMEZv?Ec1lh81b;nffDy#t8RyzXi!jg65e{@%0wFZ(uJ^Kc@9ejrAH#k z30C@8hez;5nu1Cr8Z^^IRlM|aNxlR%751&`~~R1 zY-NbHe;|+nsMcwUG=Hti2?d&!FH{aH$oaLx`&jfu@68VwcJmO?^se;OFUVf7!!;{S z3BG9&5E02mMF+hDF&E)?QxJL>_3EizWfOfocV6*=@+=!@-%zlF0uAg1xMWuKs8$Kt zcmj7CUwu?$^LH*G>%gqNM|ccH0-u`zM`FFRvu5_hk@%H}b0lU$dRa_y%Npius&Vbi zcC4w3`INw&#&vqc6m!v2SB@4!@~L+u*Qe^6>E0$|DJ+(z`4$KH_T0G~NMC@Vuq$q> z3Z<{It=Q`>bQuT=2w#POS?rgdf)Sw7C%LcRpX+hNda^Z4wIFXhwJp-6deM75wRKtV z4z<6(Z^x7{=!EhoK2&eh$O%K5+e;B#K@MfOAKj6lPFrvdatS1?tu=bi_t+$ipKn6W z**mB=5GyN^?IPo%mc^AKzAhdov*P4=NfJa(+tGhS!r=Q!aY+H=D?zwn%ZQSzGkuer zPHwspTGKg zr!j48@OgB(#qhSm@}-}P-P;A9FMJl&%lzeH7+Sk*_ojP;Mq~HE^N}y|k2=j~p7>7^ z-uWby6!7@7*34Tfi_b;R-9Yq);OSJaV&RwMq=QP|u`vv@2REf9ECrIvppPR>^Lohh zUHa!PS$;0@s{_~uxEF7mx?8GUvGxu+h-opB)^!ObFS$t5->g)UD04C92Bz?`v zTAyWY4| z$a@+up|7D&{%mYWKoP-QNZ4T{&r8KzWpwcOTdZA9>=F0|qRSOeig9?cjW1=b;g z<8qc5i+12@gWV5XK&2r)9^RZDhx+OR^e77s2>?^#xhhhb2vu_moIoe~IiyHz0%Tt50znc+}yWjR!I47t^*~w8!&Gv~_ znF_!W&e-e2_>asuGb!B%<81NIVcRPX>QsIp>lA(1Owt~2|Vz^X1Ew#>`+>kZhMwJ z9WRiQ2#KQ4s=hU6>jTNrpZow{(9bqqBoy3F#JK0~%x1_;WPK~mXgIo4JYlmnYZ$+& z9AfNjFy+037u-OY$EU0W<<_dJMmG~fQ`Kx4qk>0Ug7j9>DSYh6Vf;}GipFb%6Gtj4 zIjQ87Y1LI(X2v<5paRJ-r}LL&-)5fNZp$`Yz0JSy00!aEi9Y=o%Rp)l)oIjZgy(!!1JWSaveqUfTax$ znv5YL$RRj?H9H=pmix`3Fha2y0)^1Xr_fH9{&~RxaEah0|1oapYlm`*rP6*$t(1RoiB|eRESO$~U9o7ai|vJ8El{__ zR*Mv5*QD=PMpzZSr%Uw4O@UVT2dI1~zwcrV9*_z^pVTd_Hw#3Mb4HKqn!kd1CdqO! z(UVG?(LKK_@Osa-`n5>hEXS4H3m+y6Yw7uM zrUX?X1E~Qy5V-srQ~RhQai&R6uwHVT16bYo$s_V40LpOu8%-<&vczi1FVSLPmcwwj zDN(OYu@+ZF0r;la?1-lH`Eb-P~e_LjT<)`I^9cMsUK-fIc&o4e!o>F5PzvxZObEQWA|L$>*l}fRl}7($G?oJ{*() z_BNdQC7kYU33ch?U-doV5*JRmL@uSAMU(=c<%MU z`O7rnr!9%Uxdis#cR)L8{xdEy_?t_NopOohLD8R&@DT%X`#92y0 z^o&dVpT{K}+)hR_8vi+(G12g^US&Jbt8@W+m2a<8lhgyf%I3!nMd+0W_RZKQ=4)Tn z0>18x)~u;iEf`F+c)ZNAU%z+uQJRw^)@s$;VLCcW2!zDdF+mT>#)JdY9NofZBaiHp6eoge+>hU~V@xv%*V zfV+^1zCmEJ2oPQYPK&U6eJygd>u)V$YuK=7cXVp%DTVw2(Y2_1E~HP4-aM;{PE$@G zB2Ttv%ZZx-2mPB!1{#uO6>?6?;DLGtzm$n|Rn_B{X&rm_ z&40dgdYVJ<#p}7t-VZw;zM|+@tw(j0Pi`4pUwmBmW~W%lubx)`d;?|3ttX?sZmKE; z%&TUkxmN=)Vy2Fu-yDDuy!y|{CQVEL7}0dk8{QkZzwd#rOfaS*&3=1L0oe&<#Jjkw z_2#Y*d~rwjv&*@LNg3c^qx^vwH%rG;>}7A7l3-Tk4At%9Paj7FYI$8QynY1+2|s6~ zU7sCwmH#m+n(f1f%Iti#n*4!kRC(#qD!4j^3O=9BypityrYAq609w<$asd88mXKk|J zbzG%_fDtIt->YpzEqo(9%~*2y6)?`7gt6+kWlw zQhm(F9jQ0fkag@!5=^WFYr8r<;q%AZU(;@Qg3g_fBtd8H_uXoag2TRLMPtUlhHt%8 zbRD?<3f>jv`Eyn0;c|-zHpd3XR>FXIZz*+3>wIe}h`pJt!(fd(C{Z zGiYhwwTLD(fhHJxu}fRSH&p7S7sxQwfb(9-=w&_tK4e$|@L{x)7P;=7rR2#ohdiI{ z_q5YbQ37SL5&)2dPmC)<6#0{BWG4%RHHaBub9=T$oFeG(n?i;|1j+N z95Q&!2~EhIXdix)8E@Gz7(4*ZYzDjtU%-nXRmHpH7I@e$^=#j4&NfWTkKi7aj@?Sg zx*kf2In)>)3P>JORVY_)uPd}{I})C_d?lrI{QFQRKSwt;rBf+lUfD<3k03w|^=t!i z&E8!glmOFtDj<7qW<7SzJK034v+*M%Vuv>Ts86H+lJ^ezNAV|ZVo1LG4$>$P3pq%V7R17A87a@t)M80h z#w=zfqDT}>r+U|L5JBVb<_5Foi$VsDapf!|FcH&3rofCKu*xPlW8FBMOGY(YH?Irn zY=Hha4=3l2-fq{_b>J-VMSsL7`w>cBj=9cwl9GUOI-u=qOkaiN5}ljP~nK{naP$0*H7wiHL_*i_c`arlL>KW!tPVs3S@OvMMfEUv)=jG40b~s`hSLhCbeSj z=un^@c^c8WZ9GvNEXE*ujKN|!UTiZHDw1L}p3vN#<_4+}t8}8;6SrJxh?5GGX>VNw+?b^BBGer8o|^iA zM6bV%2+!JcleO)8VCs__4R;MBFBfQzr|y;-?2U%-*p|_V$u)jO$dpDXD#58)A zHfn+D{)$y1OfEViFH!1gaM1?g;6p}zzQa|TUbe=s=%?xB?T>0&sO!!t9Nk}JV)3i-JO!{$OnZzeMSXuj>+1cu+xfpK%zG7q*TCuY=8 z{2){PA;H9q+t+wA(T2U;TXDPANT?#Oy(RZ*Z`gU=wn<>@v#9-5dOhFG=0S>LQAmTiziE)kpytKLxgW52<(L9b(kEdfj7Ps_?B-QE;fKF|;mn^0} zNohT@ZOUcwj1f&p)V-;X$#q>6Uyg z>MKv9Skk$s2Txu-c-&itzVzUQblrZGRzqz zXUQHl?P2ny%a|m=9an<5xDS*d3?l2(;r`>|G6!Bc)S~AWU*lyrJ}A(+z{zm!JTo&0 zKojW#MPM$rB77s>0k2K(1w}fw(=a9G%`_xuz|hiFA|xLOQ{ti!yUFkJK0q1%Fa{%P zd1eCo?3SYPJ8Ohx+Wk^_iPEZZ=>*w6UVLWGr7D*-mcr8e(Z2{^cgfkXzM%^*3*)!O zMn>lnD)~=U^~-_C$(6-?y9VbeM2O#S-d~=bf4pNNcVRz2YWLW0jKcF%yVA0()Y#mh zI=nEs56J|pr4%EFdDrM%0V%4ojCJWZFvK~$#J*{i4WBcpkmM|1dy#ss-;k&|u73Gf z2z@K9k3@_74A|jz-V)DxL3hedQ_JGjF5P=V#!D`bM896G&Lr7ahhtI5%!5@O`%{P`twyKmT6STzBVc zNc%ZSi_h^Fq(F@0R2?^mn=?elR!I%M-Lbv)@KHYlS?6_M-S7u4A(HzG)RnyVUHGvC zMwR(@$%xvX>(!$YjHVV>O!kB=S23mZ;FTyvhvAQ9+mX>Mc$8|~Qqw_fIj$1hVs8Uz zAH3OkZxOUJ^G2>ggYg~tks02Z&|hk05`AU5jRB5v z%y3gcczBWbgKc0rx;dubFGa(ND5U6h4%1IrJ~wdZS?;ky-@dDj{ z-U}(yAHs)b)Gm5mkRB!GMor$X3G8FPyg6x=!;? z^QIcA){g7$Kp;YF)#$>kN7kO5&lrQiyuW7!Qkf97^(e%mC`j1L?-G|STe1RRJIn&M z!<0|5gwuKk?h2#jM0l8=H-n73h=n2Vss{1W22gB-1^S?bDSbrLY+q7e+YaZN=Y(0U zxv~p_8zszZ+3xiZ`C{IAvv!5wAcAWyMDSo7uF#g|weI z4@{$6N70&VRAK7y%aUVcxypo`UU%WDp4*&$0)EjJ65+O-nl@2jNletOWRNxNPNAP! zoT|4gEdx6|%t1VsC@Yp2aSegN`3}!2^v0mv6VWl(UVyPIf+#soO=nt56CZsY-B_@% zg5XJ@vP+Gf(ntNi5+@}&_>#}<=Uot{j0BYxWEL#?>Pt^LBWDuZ0OqXgLru0AlI+SV98XRl6opQWMTp2CVm=ckIYhQQVzQR5U6p0_62V;`;xtwtImn@3S6kMtt8uMV`mYxfK8-s( zP~$?cab#8Anfzd-o1C8D>p3)#`OpWVSjp#NU?$a_rZlUFCU$H(NMPhvF&i^-A$D*H z6E)aP#m}^fhVh5apecZ(42#?=>&B^ct`_RC7qau*feA;vJJ!^)!=w3Wz=DQ;Qu2{R z?(;w>L~oKoRgBp5(w;imfQ#2 zhmR9E5yp2*7s&`L5`cpYZ0n&e8E}!oa(}NoR}ab5yjgT<(!tH);_(FKOjY{yk&2ar zQs7js0EJ8WMB%b_#QMx_U`Kb#c@Q@%p!8ir$-sHMf8peHH&5dg0KP*M8uzVWzh+OXev{DSw_;D_huLM-nf`4 z*URou1IP(J5(K-V6vqe4WqQmL)-GG7RK@mG#n)7QOD`t>=ah!7kr94nVSAC&N@zR> ztKe}i23(E$d)-s9s^3Vy0a*96D8yf5e-Vxw_xw^Vf(;t0PQO}75?(l49f7I>h>>diRwl!mqPtRyM_ecH4SXe6iodxCtK}rU<>)B)h@Q3!U+V*eO%bk)>0rTNv?MMrAAF*o>tiZZj@U#)37fbM*t$|Qc zQP&>1r6G(VF&kgHMv7N_)Rd#SRn60hyU2KQRPWa<*;slRo|q4JY1&W`@k+1SF~#K;3{5!mLA%3szrow005Bhh zV^Sq=n(N1P?|#uuCN)svWk>78TC3fS%)+U`^@ zXFLoLZ2W4nHx2^G!?VW^SmwEgPRT=H-&|hhNOQScprAHu2r%lobUNx;)Dd!0t=u9l z8vz;-P4&Ow1FEmvvg~8;!=JBk@ZpLV3$@_Q-YL}agw6#IQd!G0mJ88>EGS7&M?EciLB%u)mXsti|2^_BqAN3U`)t(nY}E5?)bniA z^K8`fY}E7rgHg}_O0)969EtcZ-(&ojy@&rP`e1$awS@TO{~~e-l<6t5@7a^uDL%)} zdn=NhPu}Y@#zWJhwyBdr;+X;-*RDZ`n%~$i+1K#kds-yLUrCvs)}B)afe9j*L2l>4 zc+68^%Sj{qzg>p&rE8a$(Kwai#lf?;fXd*fsU&QjtUqO2x9ewwBz$m$m;G!HB1(=V zyz{gU#s4e=Tl@Wn#CsAxQokatxU{Wv1(Ia%+P}nKU4QMQ+!JV-SR0l!A z`?C}h2|^q%WSHh$mLr zuX|ro;fW%5e4H!@E+>b@t{LTj=`$gE`+an!$DfZJ-9C!S6-!9_`CQ%?HSMfKS-E$KZ`i;x=0_{&SCz-eNRR zJlIB0FH16SvajM&OiUbRBJ24t~EPh4S}`ZrQHU&=j`OIw?EbgEe6by5yCS;3nvO;S`y^Z*Zulup`ES@G*|kAiogrh?Al4>x%)BYK zbkxcy^AC53@W>jrCD_p6@%6V*LCRJjw=Q`S!vmYA0q?=#Bd06C9i9Q)!NR9Q+!MI6 zs5^lU)AMFnP8Ts&q|rto=Xh97X_$pvkg!dVK$XJ;rz-#*rUB?+AU+`oKBRHv(|79E z^~IpP8U4c7m3{1(LpT*e^2Z_&;wWL!0G(`y3Qm-PgyYIV0M2sQvy5jA9oILz0*e@t z_k3N1t5VKi^%j_q3Y?E{8|Rmhh^8S2McC8nM1jRlT!*`dDtUfpky+NaX|6HThBfcS zm|8~&c;Bu)DN?pO_r(3q`%pdUqjx{4ua z*}xU$BVlo4UAhAu1_Al$ba@(p0vG`3K<=ysK!*=e5PS1HDjalp29E=v!%Mi`E>R3u z7t*6EgtAgQ7N#cG!O^q9*nn`afn7Kd2SN|=jg=m!x|*_<-fk_o*sK@9XTI?l~DM7HO`2Ns^mjqJa!IaXg|G za3q-S7lvIoiarK#AZ)$3xvijkq5X3=yo|HtGvY(>^>VwjFn(^GwAWN#ii&JziBxKu zWor&Ag_((Fw)j9~EBRV0z0g;!y}EeMNqWH-#bcCQun>FsZQtNJX;;`(m_e?OP3{NTm>kIWi*B7Qd9NVH0O`ei#TX_fFs678-77dieKk37Cx$J+S4{gQzrT-Z6 z1n9%1N@?**AHk9mE>>(z{Db{cw|~$F*D(|@0dtC8^HJMto9e&vgm+0bY&L>O&3GO+ zucIKJ10ZV)P#?+PcNc-c-9>38pgzpxiqo3ri5<1i z(YhDeo(*hfxObx1<1sy*h8MvhsqMF0KoT{Si0xWpUIliIrw`TTjGm4{Hp#Lgi_o z@{=hQ>Q4&-abXu!y;L~`W?K6X>O=8w^`Y~33}S%wzv(@U=w3ThAI{W=Gxgz2eK=De z&eVr9_2GX^efTfI2Zq|s7u!wI!pU`_R0?eb(|x6ng;4cFZ(Lr(NQsLEjE-2|U3nxi ze&KtwBzMH5K#*u-KyZ<%b(%#P`#@XiBZQ=?#Cz=*)Ma}au2L(b5XMV7PiWbxyy$oz ztOBV{v`QNhrQ=IUn#xIoAB7C=k(rPxD$+Bq}iW(?2aR?qrg7GZl2*1Du%#M?8? zG`p>~875J<#3#s3)`@_50G~2mh(BX{)JlA5_`vD8g?ITzckq&iX@3iqRDH5enn~|p z5K%j!%OCYx)d*V74?sGeek4UOgNQH#Fw;IeiY`y4JZikwKA|obGg1PpdiSD4KGtEz zqeAabVTG>{AKA)G9*TaFK){%{T^NF1foZ`F<-1NsYt`?rp93TZe0LY}qox-sfaFkh z&-*>`6ZVAzI}xqQMcVpCuV}n*gy^2_l*MxwXq;P-IuN$}hP5lEv0RQ)tR5hJ;vOJz zDmhdJmFk*`4^$B{%qS*$RLCLM^n4}pN-$o;hsV#}zW09aY35s)RG=nbxi%q^J|&3$ zsdPhi=;6j2Ur`2m0+#U~v-srSxb)@P*zaN@aU&R;KSMtx>dIhyqmBdmsyyx=yjJ}5 z{Ub-;hnv1Z?-n6oXQwx7WayHV-^9Tp=};jWAPxAvvR-#=nu6CAky~s?izZ}h3mCfK z0X`8OMscEpcgaiBQ_-RHggH#82HW}E))psZgu8+e1Zfh$@eDnOUl<_`h;_gXU=9<1 zn8Vi%1Rtei|Bw%6+LyZPqhenOS-#R&n|;lsM+ihYC|l!I&+{n{twoJ6>k9_UG@P)&3k_H{CY{4feA zPKJy{Qmlp}5iWo04pQZ=QVP;d5o>4|jAITSvCFL}J34ga_ux5rk`eBV17sW%7Pz4c zSxM6R8m^#A{a!}eY%01O-K)mv$WtY_+o$?)r}yB27ds+WMpIrx)0nxk ztSJ%`hIF)#B(API7zuhV>ALt6=GxNPIQi>$3#VnppdW-MGy}&ag1AwUu65(s2_y4G zuDkwR$60PA z07QK9lN%GyKd+4g5u2OJ+c`Em7J0Afas#N+Yi;RfeE9$n(F+r-oS=Lb6T0VMoWPd8}Q<4`g2TfCCj^@kfTb$0Cf;E2%}N2=1^q5C9)V$ z_H{}3NU%Y~q``Th0od{ch^s|Y?1+i9#P^^)&qiG&(>#D0bn|2UQku|taC-f94_3j{ zcvYYT0o-Gh)kg0(E!5Pnh}8qsg1)CQGpEqES`c@Pv38%E$BiExjC2f^g`) zwXq31_bQSrPD!f=a>o>+@)$Y<%5zu8lU9rNS?6b#R*z&*%OCHEiDR@S=^S}MN4iUE zvfH)d)#=rg&z@FBHO#1f)7;h+H<(dCYH&|l_4*G9z=yEoO(q4EY3OtYZ8gp;GR(C; zm{T;Pc=TY3w70dK5gLf|AwG_SmU{bM*Y=UVP?!StJ5LIgs|+1U6^tmrhj{Ntwnx)# znO-t2N7&REB`L2@!)24OobV zPJ{@Y4FxQ?!l=KL3{a;%zw8~sdwf>ocR!EKE#<1appsu`4DG5 z#QzpP#QzwQkfE5_yJIH{Pg5tqeXvu}uWmPw7XV)ujhG)5$;|d_6vKQ9mTWk$HFS*i z+JXGMXI$=$K7|h)|AG&;r|^NlK3Oa94}93s7K!9%HQ^_=TzwX-Z$k9oA7Vp~cT01y zinCGEv%9;V3<<#zI@?*JAMA9%Qd1y;u2;)sD{__(4&_*JXB8yhS_buPT^90Q4xJDO zrxW5peqe{MH6MO(Fr~`{f&%*^r0}2bX^230QgZSJS!io~`)3aWP1m|>;33hrFm}#h zo0Rp1`JWyopfkoMGt|y#oXX z;+I(EQ0XO}lM=^mw)oeuj!nxl@5oij@I-gNwKy?j2rnQUmGhhpKL-{|s(QM^>O7w} z-`Sj{|Ju!6yZ`aUgLmQ=6korCBMFoHcI;GpDR~Bb-m;W~Xn>^TQNm~Pg8V`5P^pwp zT8~R6C107}_In%m*Fl5y<#XZoB+!7w!xktAk6ZMsG?VKaqTA7%*W(j*M&f2w6nF7; zYrF%2*Dfg?KzGnSjL}ad@C=pRPgRiHu6zi-s1yX|&Jb*uZ^uAI4xeGE7&`O%qaxp3 zX*nY6!=U;s*Rx)2hh32Fl^HnR#QxkD5C2trWx48bkpaYQAOfshK%jIcFL6Q1F=fKZ z%Bx2v@f^Y5=L2HLqyg7qbB$Ls*(?90Y5M_L62xD&jMWJl_{iSwfWX#z z3c0R`+QJX5;taiJg`$D`up}!0+@b3acSw-1f7<5IALflo@r0am2T=ILddNk!a67y3 zo))kq+7Ij|7Ty^u6c+Szl+kTf6F9JV1sqr?BZm)e08xi?hc<89yj3U>>|&^LD2GW` z>JA;up;z)FtyKHL5BuEahp8Sw?&IG!5)FYb`M zESR=8;_uq(%adcBjGv5IO%R5IApXf8y3Ds046R^NDGP=lY=v$+z_xt-zuR7Q#iZdK zxf9J>u^ok6qH}qRrhb0cr-BQy?-RQi3G zI1lbjVJ-qzP%I5C9wXAl8V?1;9#m+r@e;?Ga0}gxaWGnOUuv<#i-rqR+n52wfg*L_ zFvCLFoiN6aUJ#FQMb`pjb19q{ih)a0ZnRpQ95hnjv;g)403Bu=9xPr4pu@ac7Ed)21)N_P6qtDx1aPP8DyNskP+y*M z0c*Q&#(=(zn)Vw-KYo-=K5W415sQB*=jklmk3)#BD@iDu#RxdX@NoROqFs~|WX;Vj z&w_V_8P9%@;VYdUwlmx3cNd~KmEJ!Dzz~c%X&Tu<54kDcsKW@BEOp(AkjD4jEph~e zokB6}T!)2%9-=@N;#)-#bcK_XUQ{G1??VN`h+Oi=rv*xsC#M*m zxKj)PVmN%P8cRJ{Vr5e(xM|eQg98xBB()tmn&Zc0)XcRL~6s z+~Ur+znc1`#$c_ak~A`Hc`6D>QLZ`)ihigOQg3*&RkzaKaM;3pDfhzXtuhobH2FXy zPOM-h_a5F4j>e&=+DjFA-x~ES>UiUn03~8R05Y`!-G}{FBBo*m#J3W87Zg@vnia~L zuS_=AD>NA=w+g4#lWf<9C|~uH}J!~&TqRo15%@|7y*A|-sHOi~)22HKNO$O6ep<+?kdF>{kMtMbA zJ&-}Irm8LUhr}Jn4*WP=4I;uR-kB8obfWIiSbpbS>t1<#9#DhW&kNda8uaYO07?W! zmqQN-RzvCZs=C-obM9O3Lxzlc;s?W~Jph0>)(`^##LIEevmXzpwjUTsNeu%Xh`_#u zyuSIzO+PCbeQ%0svz`D5`7{7P(DD!w>=nf}_xnxo10BlOHMkDt0u}v|Y5(qaKX8rl zixjty@y~gT&!$unCrX49C5RSKBC573rv`gI{0Ajs@V64t{kuas!2aLqK;W)1^zWQ0 z5ob!onG$iPM4TxRXG+AG67hey67fICAA03SzVbdh!*A$e%HO2ZI?wUdecTJ%^zcqX*TYcr@Q}MvAA-iT);u)&ySH}2>TJD9V{Ahy@hAZV+7wpoWs@=ROLDCs!5mz*WU;IQq|3#erz7 znK#aly%`6Es+5SUb zG5YvI##KqU70qwRlxV|QWn0P7#K$v{z*)r%RKD9L;yK3CLKyD=?Vkb24Q-Kt+)&Jw z@>_1$4}kB6j|xYc&MO9qn@SQ&e&I6sh5^nnVyOJVu5idzLn$r?p>Q?L4KHZ_9I>t)W_0DKPf=7PUyx`=b{gcIfq7@&mDlidwLCGdN zK~wBe1zSTGhaYff@x@Ei-w)sl-az|t@&9V?KD?Sr_jiHs9f(pyL6H_jKt-BP#70pM zh$zJZf=E$B7`l$ANC^m`L+CX?5JF8tKmvr8P(o7?9T6MI=%AuB3yKYxG56gB)Z?6c z*Q|5bZ{2mz$^I|)=Y5{%>sIO^(Pg4dc@ab#i#PWmavcwY6&%#0NpMOxI&@mOCJO(! zTTDtQ3^{o*{ zL&Z-*iElpn{24$NtB?O)9xP{wv-gnuoKZMxOb#_#_YiEl^@lqcZZo#!(~ExhFIs;u zI&8h;FYi_g?uM9erTbSSgle(4}W+oyNG_2Q50wntu`lv^h2LV;(;*>6uF`s=ln!= zhZLiHl32bWV_926F6sKWGDfUFz0L6QaQ60*oa`>bCei9Nf?86%$)yLp=!0@Oh(0_8 z(FbPXeahwQrs&SHGH@&7bN6L|#+>DH8c6g3o$FB_A|t9=*%wK7E~&j!DK%Spb2-CC zze1~n?(3MS#9M=ipddSxjzyr1vG;oAs4f{hs|E%kUR}?7V`pYyg_JQ|bkx?1u5Y_b zGbAxRo>hlT!I_|pu{PIMzlN*rQ6us!>9fZb-esz!b2@*myx;1FjK*r5!qOq{9T z>m5J8L)r67!t!rBl)iR};}%S2T$Ag4{g4!l^4t-O)8Gh(AjK}VW#e_^2nKoqA0BA5 zylig)JCuK5e#D1Y-`&7K`WQ?wMOo0&^8-FC^fBuG@B0}1BN+T682lp`{396rBN+T6 z7^nF7z{iJwH~jGb79X}0WSUvC8&<^a^`Ejx7&_Ha!2Au}@~M_24vQ2^Ub1YtP1%5P zv-_+~HgT+rVT6T5XXK?<EaHI!(@#*+H*ojl#TS;r<97map8`|+ zz;7D#a(gIuoC3Q3u;i8l5=N+q1z~XH2}8SI$O@kaKp1L6UGVt+y1>2UfMGvB_uKFq z{ZL(Muo5}w2*dB@2$b&TJC6+KZ~z(ZZ^t9Z@cbe`h8;+W!dHxnkB@@%8p5Ue;gG4H zWz0hmWWa`X7)1eOSbx=Hk&XNS<)T$o)H%OJt4l18dqXI1PyeidCGM_EuPKWwh90Me z!+5CuX9pL5e{d$#^Yf|ocQ1k(#q!>0lM9D5VzmEQSdGjabrJaJ+)@)DqKd+p#~hb| zQVrhTAl2Z`z#cc*vvY06Q5(Y6 ztkmXviJr7zOme7r<9;pKxeX&8Gf1Mf~+{< zq>KTZ-=Sj%rFLGjCY}d#lEZP>)L5qM8fTDaa3MKFkiad?y#YDKV{imD6NX@s5`Sx< z*0%Uo9)9!<{CltnqlC?v_A%*#5X ztChK3nYe3@teSTE8EN!qgXBm0`M#<-QgCj>dC!WYIi3FL6Ec`r9=%8t3Zp~ie zK(`o|i2rtA(}_H5YhXE&;WU?LkO#F2WkefZ47gEarNokRyZvK|_MLkdp)fOcu24uz zAia=xX7eMB2!h#GCPw$?S-IxlC5C+zCaOsO6EYZq zibZJ(Kn7nN#XpDQr+Y{bhy4K=Y+25ma-=1waOCHbJePzGxWlKjP7O&@#D}4IZ3w3+ zsaumpev-moLaG);G!S)=6t>YJQu9k9MbWT?agnrn(3(jy!Qv7(rqOrq0w<+y4ZeFz z`C8|){RO6Z?{pagsz++{7^b#y;HP#7Zm)-71}ub!#1(NFQ}CB;ut`bU0~A91@)gta zZo7hAmSsL_k zvy=y81aE~Svy=sL#4%jCm3X<3y_)Fq{Au${tUA4xiOf>6JxX_gS<1c$dK$6Tl3@u| z*A_8su$5YyD|~wsq~{@`6oCj1xW=ibSf;&A550IoTbEsD1*R6Y1d;kHRy#Y*nzoq`n=P8U=tv3z zGDA`j&DS8_5sa7jRj-3S#^Bs>&cW=MB85PVsyQkE3`0B>-GJ0E%9{O1}5gXa0KY8WecHH@M8S<2;2?SK0S1~2^3 zWgXOIliOw2)Wxr1@M94C7z95C!H+@kV-S3a;7bHwBK}7u;vf~dO>ukCy+UxCqDWf4 z?A~L$XO?H4XW!9nJx|eNY>%Jz<_1mV)^|J(obZ-9s`Cgk_PF`SjDC>e-X5uu1Iv=k z7WH`1#uUD2zb0;6w<~P@WY5oG*L80Cs28}tBw5^+6Z+lZ!RpZVD(SGPoBJ+)c;xV= z@o4{yxRHNbZ0)J;EU15k%{nkkcmpuu3NNm}2=2E=FyW4$-#LaKNGSk7;LZ!eazqfi z+=Az37=peE!sLTsvIPX5X*a5(z$W3LD7b&IjYTR1GRIr}9U9M_%gqe#3JvPs=c1$P z_bsWA8Ik=d*i|Zo+6If^k=v56I7$f*iE-dVwc*?5D8aE`tWjdmjk(mqL6BP5g8!CU zxEsYwEs!W-%|{?H1`Ly7Y4ezFTf6I~=E zC!`-klSz;!!)rKjzb_z$&=(i5fEWfBh@q=t$0|S!S8#wBmZ%bTMoZmNO?U?$;>qR` zHtrzP;Pp9iA=BV*V~)R~6?$kP({Nq&$c<}BAfM8!n$#x)fj9w(H7xSjWQ4>TQp8pU zdLXfeFssGMJx3F}p7?`U!z-D{S4W{W`YBsvp;dT=s<~u?4w7t0%>~JZEl9FK|Fahk zj5S0?iyFs1QbF!(P>j>wfk6v>1JTVY$HA$JEpCUslO%jo9rnZ-Y)0Y@T##?DjWsj4 z@AN)Z<0sny^Raje=ZK>d5#nq2->d$SBrj^>XT@BQT zcfk=LbE2dyN(7w+PFEn-uqg9p%E5kSEEW|_9)q?3Ygm`#uqOvt!`bQdv_?47HshoA znLpeT4~FGfD@6&c$)w*wDidd@sgaFI+6$G5ssXq2!YWK#(rp=t5JNn;8@d3Xp*?+j zDp7Q|EbN};B71zmRTJtzy^6N9+(i4vKq_M_y;p~H*Y?u-3z?uaaY8Nkkz(*mKjfC? zCROB$#T(na6CPRfBa)lQU__ET(H(wxGS^-__T}O153z)-*wc$e@}CLjDX0d5V;17P z?nF8<>tlxOTz5hXbSJhHgg%|Sr%5h!sy=AxSfD3$sjHv>V;AEWt3VhK>xjPOotj5` z9{YWiL6blp=-PGic8SAGiQ{<5)SkS>Ka5HW6vy?)i#~@f8w;#G?6=K`wY&)L{upHY z-JC}>_JOl1r-p(tdNb)VoLhDVne%PX>ru{0n&k){Kw$Bg?=ePJ$Zjh zv86K{e|@vLoPOn0!H#!XZ-o<6)hMFtGJJ6W2bQh!oMIT(2O6%0I76Fa1`t3Bvd z5=jpT&?WWo=TD0teNtY76TIbIE@NmIgR>bU{PaQ{U8KvvS1S%?FYA*l4wjKDHO`<5 zg%hd}YoNqdqS(M1Lg|K?ZI+BhW@R_4FWWfME*n>nVYt-2;*Jc2@y@^wD16CQm0f;- zd$$bPegFXoX6{wpeRN&)=(x5@V6_;AB2Lp#=2Tl}MIv<43!|=5985NT5Qs<%W7IF- z-{4+WDb3uip}e}c6scj*veBvnxkQEw@<9L_SL&jx9`R*MbVKP8I!exlI72J znGSoZ?WW20jJhNE0#L?i_RL+YAH0-vnRg&#e55ASD#}2kI;5!3bs-WFBYN;Oh(v&i z%D&9O{``Hi7<*A<6C#+@Six=#i&Fp?aZJ=8W-Zw?g-INbcDjqXcfRS~RLVv|(+$yF zuu}PCu9A^+4MJ)dUd;d_Zp=x<5T@mKdKFly#DPtSIgA(%3`Q_QAHj&TbeZ?FEL~RN zQpfUnj8JN6lqmRQ&sh}2`Tj z*l&D{;Kw5Pu?T)Ff**_E$0GQ#2wgr#@G*jq5q}FKK79OH27eJrF)%_po`>;L3}Z*- zuMvZ+RKmYcG3?F?c;n{!mV$lpAuJk{BzA{`k_3+%_Wi&O>5*T#!HePd4HwcQzT$$z z_qgyG&s%&vJEGt$V^qrPMRY}WNqpCf(254V2)CGB9@;TZcOyU}Le`joG$Lv)2JjjY zrLjGCLO~;<95f<2@nQYvqZX-hk1tkP?H$~pw<5$h!lv2>Yh(@NKeS}Me~Xf(hE@V#wK8in&C282=<1z zd8EmSLn|6>6ijvx%FIO*I0S*Z)NB1f3=$DB*c+?vl9C`~kg4tZr%;-wjHHlx+V;kb z?X-d&596!eh+H3lt+JQ$+(ZY`ZgpJklJdgW4PH zG7Hj?%a`vW1O!rfc3@9UG*OHHY6t!UZks@8fShr$o2WZ>*iG2xB(Q_9OkMmT4`@+XSWvH`Kk4`t^I=ZFm*UI$7M_fz5r#GYOa{uWax zB!Np5nvLEBVH2wAGSG|YQ&ZdEMB1u~&Td4XRW%gC=Dw6gt-^be1n~oE&ZCXF1fe`P zr6e>KUR9h^>9JdRju8X_BkalJF~aOX{#zaNNTV~CWGk5RgJ5co zZ1?71e~oX~F`wi=Xq>x_DN&@QTeL;JXlgj;$Lp9Y3i6FEq8WM8y17D*_CkOXd=W~} z{EiYVd6eLsg`^cMO8_N=PN!Ju7pHG6s0uAMc}P@J%!vs|2ws_mT&utrIpAE1vbRY= zrSnOJXK|L@qzdc_FoArDh;{I9};0jl+ldxJSONzxPi4ufC($gxIh!^?KDN-rFB?m1T<2c?@{T5fJ1YOwyd?EC#LYDhk~Jj3JbOmX5s0CQ zsveQc0qjyOoQ+6=VmWu75~QmR4PMGsuf5ulzfH6pxwVO}9lBd1x{h&%0G;SYp9G*# zo%$%2@xHd&2Mj!P)qysKfm2n;3OKmEdU3e%ZJMM!yVSEEzBW^;Gz9Op-C3x?`n^A; zc@wLMeaWaqp?>c4Chi(kt;c3+umLMjNo*FI-89H%Pn3gw=; zE*#jMr`rwB?$w{B$=ugV);z4g6ib`;g(vLpo{a;6Eu*9s-sa@ju!BoMbCS5E7!cq< zc*_8E*>l;q`ANr;bt0<>3+Fh`e7(oXhH?QM&zPklY7DW^XICzETteg(GETN;i%ZIL zVDTYX-aO^Vrj9MgI{uwlguEc6G%YAB0Ih{IA@JP*QVcEP>Zf`eYsw{ED?ZnKN;kik z>SJ1ASJ_|g+w%(7I>hkbzmarnl!?3f3;XxUhMbrz%f*L=g-1k2MaRSv z;^Gq$lafq})q+`Q(DaqT-TL3YAtyFR!><$*8KXVb<2wH#D-?P0cN> zr_oSHXIFs*(VK}q%hid zx3T~*!7v420v99^fF_LI&e&*>(e~6tR?BOrY|LbTvdT0lH9&|XI3;f{oXa3wOGL^J zZONOCq+KjclY)u+m57lq5`_lb^gR~KPAmJwZakHSU?WKbquE-6j1PIH+0t9Oc01&i;tbrR@&o^7k3R38WHjWo6D0-vyGuKU@ zd;T;O>?q90?s!hzzr$2ZK`#5btbSz?XC^bT&@HZ8pI%1^dt;| z5+HeSXdqEx9b`LG)a{??G$Xc3E=BL5R(Mol{>mgY2dPU*V<|qS6w7hgZu%P;tmEYm z&X)o)z<~TgYHG)ewE9?L6%3!VqojLMj+DvpS`OMEg0Q0W^KL`g8Jvq}sey=t$M^=( zKH@aFSgkBfQs0D5@6=Z{=w7#_QV3-&<0^3k^eI!@{dUMQ zYK>gQc{ykkt627FHqQ#f?3}Ij7jE|d^TPyY(dFD&Ch=?gK|N-_{sQG49?Il(@MMD=# z9#<<~%wD!Tr|{Ug4l>^OA-&ao-RW@^BzaJj>tRZbw4?pn<>h zknRGO1U3_P?qCSN9TeDG|*NMk)zk^Zmk7D11uQ?4J@+J zg*dd3TnbtdwJNznSur>H!$|}SbZ7tzLgujGs+_SIi)NKsj$i?{Ld&qs9b|lZA)(~T z84-AuqIWwd`IHH2cm(p+wSWDTl9qnid>yr~ot9~l`>UPir78&Al6Yr_zIR;`B!e*G zkiu*gXmEji5Ndt8m1kyCIAOVW+54^K%YhvfFpRG-wCC)glScz zY9U5N&5@m^bSBV)<|?LHTs6=GmjykrW7i&|*8)8-$J9CL)%|Q=$8`>*fL=q*0w1{Z zdJU5mS`m;Dsa_!t`qNHFu(KlhZT$~|;7Y=1twjJL^)Jhh;e$fp)GbbrB{bPsGh{8IM{k2 zymcA_y`N|m+%NPN!&$AzK{s(i%pq|+$9=VZ%aR>!!O6|yO|Sx|RkEp#3Uemt9C`Wn zpE}@&?3PY?n{sYDXm_=-Ta*;r)a5&#C^Mh2VMWaj?PF(_zHHkQ2R)B#*OBi86C%?O z+gEE;3njN1G9lQKuv8Wfd95^fy6Q}3NZ zh&4O_84$8)n!|89utG(ZfVJ2YFEOKdxhHGT zf1nh0T0{8taqH*~H(6V&uJ74xDX!11I}I;_IMz!XCtm%&C`hZ#eyzK8tBCy1{lDGZ z?Ixh;^Cs`v{+ti)f~98JibFF@&t!UF(l!nU*0}Pgy4$aLgXhPLAXWEU98Q{G@Z!To8eGGHA9&?Wd(=W$vd=otswJ!OA{@wG;k@a$7 zKSK|%>lw7cHa$Q>Q0=zc1@G1-zpdq20{3ei!3e>GI&Vz zSuJT}`BWe!dBv`{9RCIef;6kFe$HI2lz ze(BKzcRwQsTe}}dI3nSk*@>2|OXS;}wzQy*HMD57$poDmWVedswkf>S zQ7~_d5Jl1t?`zwJ2cctL?V2|ZH1xDd@0gbaG`~l|mxO&B+^g=XJYR3^JKQ{h^iR!U9 z>DSZ(H;rluyQpn;F3?4mivV0%qKd+`b%73v z7Q@lT>Y+zrVaMKK(wI+X$*O{N*BpH9ehnBUYNGU=Vgt4*-N?tQ+c;{uYf)Y#oVFhK z(EZ@Cc-ZyAHutr~hcxd!Ey~9gagxsqO+k6K+BpRR@hTROQ2A>^eYAz33#YuI&d;Ni zbo!wnsY@!5w!G-IrFzPuT$XL_3ax#&iusbjmju2f@FjsS34BT5OTyn9mgM&+_&tjM z@*c&1eT?D%cS#suEa)S}JvXlh-{S#StGL#kROk5@J+L6(G2b&Y}*&?Y1i!dLlp=VO)p`(~#Iz2Zwa)ZNehh5A!)}H4tNuCB zTBp$p2XUOXa0JU)i{d#;HP@+(vN?2i%d%r_1%fS~^jf5v+T>}RFM~*oVb5VmM!w~l KhBOEv=>0E%j(Q>h literal 0 HcmV?d00001 diff --git a/src/core/server/core_app/assets/wazuh_login_bg.svg b/src/core/server/core_app/assets/wazuh_login_bg.svg new file mode 100644 index 000000000000..ebe5663263a8 --- /dev/null +++ b/src/core/server/core_app/assets/wazuh_login_bg.svg @@ -0,0 +1,758 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/core/server/core_app/assets/wazuh_logo.svg b/src/core/server/core_app/assets/wazuh_logo.svg new file mode 100644 index 000000000000..b74126093841 --- /dev/null +++ b/src/core/server/core_app/assets/wazuh_logo.svg @@ -0,0 +1,51 @@ + + + + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/core/server/http/__snapshots__/http_service.test.ts.snap b/src/core/server/http/__snapshots__/http_service.test.ts.snap index 037c8990ea77..4d757cce8d5d 100644 --- a/src/core/server/http/__snapshots__/http_service.test.ts.snap +++ b/src/core/server/http/__snapshots__/http_service.test.ts.snap @@ -12,7 +12,7 @@ exports[`spins up notReady server until started if configured with \`autoListen: Object { "body": Array [ Array [ - "OpenSearch Dashboards server is not ready yet", + "Wazuh dashboard server is not ready yet", ], ], "code": Array [ diff --git a/src/core/server/http/http_service.ts b/src/core/server/http/http_service.ts index 8627557c7332..2f2b139880fe 100644 --- a/src/core/server/http/http_service.ts +++ b/src/core/server/http/http_service.ts @@ -198,15 +198,13 @@ export class HttpService path: '/{p*}', method: '*', handler: (req, responseToolkit) => { - this.log.debug( - `OpenSearch Dashboards server is not ready yet ${req.method}:${req.url.href}.` - ); + this.log.debug(`Wazuh dashboard server is not ready yet ${req.method}:${req.url.href}.`); // If server is not ready yet, because plugins or core can perform // long running tasks (build assets, saved objects migrations etc.) // we should let client know that and ask to retry after 30 seconds. return responseToolkit - .response('OpenSearch Dashboards server is not ready yet') + .response('Wazuh dashboard server is not ready yet') .code(503) .header('Retry-After', '30'); }, diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 687d408e40a6..24aab8ddc505 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -117,6 +117,7 @@ function pluginInitializerContextMock(config: T = {} as T) { buildNum: 100, buildSha: 'buildSha', dist: false, + wazuhVersion: 'wazuhVersion', }, instanceUuid: 'instance-uuid', }, diff --git a/src/core/server/opensearch_dashboards_config.ts b/src/core/server/opensearch_dashboards_config.ts index 47fa8a126501..f5432d99fe44 100644 --- a/src/core/server/opensearch_dashboards_config.ts +++ b/src/core/server/opensearch_dashboards_config.ts @@ -80,7 +80,7 @@ export const config = { defaultValue: '/', }), applicationTitle: schema.string({ - defaultValue: '', + defaultValue: 'Wazuh', }), useExpandedHeader: schema.boolean({ defaultValue: true, diff --git a/src/core/server/plugins/discovery/plugin_manifest_parser.test.ts b/src/core/server/plugins/discovery/plugin_manifest_parser.test.ts index 5ef01f88f3f7..3dedc87479f2 100644 --- a/src/core/server/plugins/discovery/plugin_manifest_parser.test.ts +++ b/src/core/server/plugins/discovery/plugin_manifest_parser.test.ts @@ -45,6 +45,7 @@ const packageInfo = { buildSha: '', version: '7.0.0-alpha1', dist: false, + wazuhVersion: '4.0.0', }; afterEach(() => { diff --git a/src/core/server/plugins/discovery/plugins_discovery.test.ts b/src/core/server/plugins/discovery/plugins_discovery.test.ts index 550acaf3f4f3..adf67dc7dfa5 100644 --- a/src/core/server/plugins/discovery/plugins_discovery.test.ts +++ b/src/core/server/plugins/discovery/plugins_discovery.test.ts @@ -82,6 +82,9 @@ const packageMock = { number: 1, sha: '', }, + wazuh: { + version: '4.x.x', + }, }; const manifestPath = (...pluginPath: string[]) => diff --git a/src/core/server/plugins/integration_tests/plugins_service.test.ts b/src/core/server/plugins/integration_tests/plugins_service.test.ts index ea400ddcd913..89280544ebca 100644 --- a/src/core/server/plugins/integration_tests/plugins_service.test.ts +++ b/src/core/server/plugins/integration_tests/plugins_service.test.ts @@ -106,6 +106,9 @@ describe('PluginsService', () => { number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }; const env = Env.createDefault(REPO_ROOT, getEnvOptions()); diff --git a/src/core/server/plugins/plugins_service.test.ts b/src/core/server/plugins/plugins_service.test.ts index 06b12643a64a..f885ac2d7dfa 100644 --- a/src/core/server/plugins/plugins_service.test.ts +++ b/src/core/server/plugins/plugins_service.test.ts @@ -128,6 +128,9 @@ describe('PluginsService', () => { number: 100, sha: 'feature-v1-build-sha', }, + wazuh: { + version: '4.x.x', + }, }; coreId = Symbol('core'); diff --git a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap index ad92d759a832..97b361a5f286 100644 --- a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap +++ b/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap @@ -6,7 +6,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": false, "loadingLogo": Object {}, @@ -30,6 +30,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -50,6 +51,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -59,7 +61,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": false, "loadingLogo": Object {}, @@ -83,6 +85,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -103,6 +106,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -112,7 +116,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": true, "loadingLogo": Object {}, @@ -136,6 +140,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -156,6 +161,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -165,7 +171,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": true, "loadingLogo": Object {}, @@ -189,6 +195,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -213,6 +220,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -222,7 +230,7 @@ Object { "basePath": "", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/ui/default_branding", "darkMode": false, "loadingLogo": Object {}, @@ -246,6 +254,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -266,6 +275,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -275,7 +285,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": false, "loadingLogo": Object {}, @@ -299,6 +309,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -319,6 +330,7 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; @@ -328,7 +340,7 @@ Object { "basePath": "/mock-server-basepath", "branch": Any, "branding": Object { - "applicationTitle": "OpenSearch Dashboards", + "applicationTitle": "Wazuh", "assetFolderUrl": "/mock-server-basepath/ui/default_branding", "darkMode": false, "loadingLogo": Object {}, @@ -352,6 +364,7 @@ Object { "buildSha": Any, "dist": Any, "version": Any, + "wazuhVersion": Any, }, }, "i18n": Object { @@ -372,5 +385,6 @@ Object { "uiPlugins": Array [], "vars": Object {}, "version": Any, + "wazuhVersion": "4.9.0", } `; diff --git a/src/core/server/rendering/rendering_service.test.ts b/src/core/server/rendering/rendering_service.test.ts index 5fa7d010989e..fdf1549440f1 100644 --- a/src/core/server/rendering/rendering_service.test.ts +++ b/src/core/server/rendering/rendering_service.test.ts @@ -56,6 +56,7 @@ const INJECTED_METADATA = { buildSha: expect.any(String), dist: expect.any(Boolean), version: expect.any(String), + wazuhVersion: expect.any(String), }, }, }; diff --git a/src/core/server/rendering/rendering_service.tsx b/src/core/server/rendering/rendering_service.tsx index acaee7f42bc5..48b1f6f99721 100644 --- a/src/core/server/rendering/rendering_service.tsx +++ b/src/core/server/rendering/rendering_service.tsx @@ -124,6 +124,7 @@ export class RenderingService { version: env.packageInfo.version, buildNumber: env.packageInfo.buildNum, branch: env.packageInfo.branch, + wazuhVersion: env.packageInfo.wazuhVersion, basePath, serverBasePath, env, diff --git a/src/core/server/rendering/types.ts b/src/core/server/rendering/types.ts index 45821c2b8228..12144ef14bac 100644 --- a/src/core/server/rendering/types.ts +++ b/src/core/server/rendering/types.ts @@ -51,6 +51,7 @@ export interface RenderingMetadata { version: string; buildNumber: number; branch: string; + wazuhVersion: string; basePath: string; serverBasePath: string; env: { diff --git a/src/core/server/rendering/views/__snapshots__/template.test.tsx.snap b/src/core/server/rendering/views/__snapshots__/template.test.tsx.snap index 36d073992ec8..f7b85f7929fe 100644 --- a/src/core/server/rendering/views/__snapshots__/template.test.tsx.snap +++ b/src/core/server/rendering/views/__snapshots__/template.test.tsx.snap @@ -66,7 +66,7 @@ Array [ data="{\\"strictCsp\\":true}" />, ,
Date: Thu, 29 Aug 2024 14:31:44 -0300 Subject: [PATCH 46/51] Change build number generation (#284) --- CHANGELOG.md | 3 ++- src/dev/build/lib/config.ts | 2 +- src/dev/build/tasks/create_package_json_task.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e78b68542ab..7e85f9a438a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ All notable changes to the Wazuh app project will be documented in this file. - Changed default theme [#174](https://github.com/wazuh/wazuh-dashboard/pull/174) - Changed default logos and main menu app categories [141](https://github.com/wazuh/wazuh-dashboard/pull/141) -- Changed default value of useExpandedHeader to false. [#247](https://github.com/wazuh/wazuh-dashboard/pull/247) +- Changed default value of useExpandedHeader to false [#247](https://github.com/wazuh/wazuh-dashboard/pull/247) +- Changed build number to match the Wazuh standard [#284](https://github.com/wazuh/wazuh-dashboard/pull/284) ### Removed diff --git a/src/dev/build/lib/config.ts b/src/dev/build/lib/config.ts index c182b2617dad..e48cac508d8f 100644 --- a/src/dev/build/lib/config.ts +++ b/src/dev/build/lib/config.ts @@ -55,7 +55,7 @@ interface Package { workspaces: { packages: string[]; }; - wazuh: { version: string }; + wazuh: { version: string; revision: string }; [key: string]: unknown; } diff --git a/src/dev/build/tasks/create_package_json_task.ts b/src/dev/build/tasks/create_package_json_task.ts index 7b8d2a311a0b..0c795da6e13e 100644 --- a/src/dev/build/tasks/create_package_json_task.ts +++ b/src/dev/build/tasks/create_package_json_task.ts @@ -46,7 +46,7 @@ export const CreatePackageJson: Task = { version: config.getBuildVersion(), branch: pkg.branch, build: { - number: config.getBuildNumber(), + number: pkg.wazuh.version.replace(/\./g, '') + pkg.wazuh.revision, sha: config.getBuildSha(), distributable: true, release: config.isRelease, From 5c6dedbf3de53ddc2b3b741ec4ae5f9e7504fda9 Mon Sep 17 00:00:00 2001 From: Antonio <34042064+Desvelao@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:59:33 +0200 Subject: [PATCH 47/51] Bump 4.9.0 rev 07 RC2 (#286) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- CHANGELOG.md | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 1469aac89413..883cfaf09fcd 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-rc1 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-rc2 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-rc1 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-rc2 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-rc1 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-rc2 with: reference: ${{ inputs.reference_security_plugins }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e85f9a438a6..b927aee53765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to the Wazuh app project will be documented in this file. -## Wazuh dashboard v4.9.0 - OpenSearch Dashboards 2.13.0 - Revision 06 +## Wazuh dashboard v4.9.0 - OpenSearch Dashboards 2.13.0 - Revision 07 ### Added diff --git a/package.json b/package.json index 314c72a0b7c3..93022926685a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "wazuh": { "version": "4.9.0", - "revision": "06" + "revision": "07" }, "homepage": "https://opensearch.org", "bugs": { From d7e1e5e2ff954ddae6c71c82d0b56f79e096482f Mon Sep 17 00:00:00 2001 From: Federico Rodriguez Date: Thu, 5 Sep 2024 11:50:45 +0200 Subject: [PATCH 48/51] Change github actions to v4.9.0 tag (#291) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 883cfaf09fcd..5449d26da9a8 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-rc2 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-rc2 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-rc2 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0 with: reference: ${{ inputs.reference_security_plugins }} From 0472839dd01b01dac860a950ca743d5df29a3232 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:42:44 -0300 Subject: [PATCH 49/51] Fix 4.9 package generation (#296) --- config/opensearch_dashboards.prod.yml | 7 ++++--- dev-tools/build-packages/config/default | 1 + dev-tools/build-packages/config/wazuh-dashboard.service | 2 +- dev-tools/build-packages/deb/debian/rules | 4 ++++ dev-tools/build-packages/rpm/wazuh-dashboard.spec | 3 +++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/config/opensearch_dashboards.prod.yml b/config/opensearch_dashboards.prod.yml index f7eaf6ac84b4..930f061b3e75 100644 --- a/config/opensearch_dashboards.prod.yml +++ b/config/opensearch_dashboards.prod.yml @@ -1,12 +1,13 @@ server.host: 0.0.0.0 server.port: 443 -opensearch.hosts: https://localhost:9200 +opensearch.hosts: https://127.0.0.1:9200 opensearch.ssl.verificationMode: certificate opensearch.requestHeadersAllowlist: ["securitytenant","Authorization"] opensearch_security.multitenancy.enabled: false opensearch_security.readonly_mode.roles: ["kibana_read_only"] server.ssl.enabled: true -server.ssl.key: "/etc/wazuh-dashboard/certs/dashboard-key.pem" -server.ssl.certificate: "/etc/wazuh-dashboard/certs/dashboard.pem" +server.ssl.key: "/etc/wazuh-dashboard/certs/wazuh-dashboard-key.pem" +server.ssl.certificate: "/etc/wazuh-dashboard/certs/wazuh-dashboard.pem" opensearch.ssl.certificateAuthorities: ["/etc/wazuh-dashboard/certs/root-ca.pem"] uiSettings.overrides.defaultRoute: /app/wz-home +opensearch_security.cookie.secure: true diff --git a/dev-tools/build-packages/config/default b/dev-tools/build-packages/config/default index c4f94fd36814..250239f4c827 100644 --- a/dev-tools/build-packages/config/default +++ b/dev-tools/build-packages/config/default @@ -5,3 +5,4 @@ chdir="/" nice="" KILL_ON_STOP_TIMEOUT=0 +OSD_PATH_CONF="/etc/wazuh-dashboard" diff --git a/dev-tools/build-packages/config/wazuh-dashboard.service b/dev-tools/build-packages/config/wazuh-dashboard.service index 94334950ae94..ef1d2afd42f1 100644 --- a/dev-tools/build-packages/config/wazuh-dashboard.service +++ b/dev-tools/build-packages/config/wazuh-dashboard.service @@ -7,7 +7,7 @@ User=wazuh-dashboard Group=wazuh-dashboard EnvironmentFile=-/etc/default/wazuh-dashboard EnvironmentFile=-/etc/sysconfig/wazuh-dashboard -ExecStart=/usr/share/wazuh-dashboard/bin/opensearch-dashboards -c "/etc/wazuh-dashboard/opensearch_dashboards.yml" +ExecStart=/usr/share/wazuh-dashboard/bin/opensearch-dashboards WorkingDirectory=/usr/share/wazuh-dashboard [Install] diff --git a/dev-tools/build-packages/deb/debian/rules b/dev-tools/build-packages/deb/debian/rules index 98638dab5602..7fe98ddcc597 100644 --- a/dev-tools/build-packages/deb/debian/rules +++ b/dev-tools/build-packages/deb/debian/rules @@ -58,6 +58,9 @@ override_dh_install: useradd -g $(GROUP) $(USER) tar -xf $(DASHBOARD_FILE) + sed -i 's/OSD_NODE_OPTS_PREFIX/OSD_PATH_CONF="\/etc\/wazuh-dashboard" OSD_NODE_OPTS_PREFIX/g' "wazuh-dashboard-base/bin/opensearch-dashboards" + sed -i 's/OSD_USE_NODE_JS_FILE_PATH/OSD_PATH_CONF="\/etc\/wazuh-dashboard" OSD_USE_NODE_JS_FILE_PATH/g' "wazuh-dashboard-base/bin/opensearch-dashboards-keystore" + mkdir -p $(TARGET_DIR)$(CONFIG_DIR) mkdir -p $(TARGET_DIR)$(INSTALLATION_DIR) @@ -95,6 +98,7 @@ override_dh_fixperms: chmod 440 $(TARGET_DIR)$(INSTALLATION_DIR)/VERSION chmod 750 $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard chmod 750 $(TARGET_DIR)/etc/default/wazuh-dashboard + chmod 640 "$(TARGET_DIR)$(CONFIG_DIR)"/opensearch_dashboards.yml chmod 640 "$(TARGET_DIR)$(CONFIG_DIR)"/node.options chmod 640 $(TARGET_DIR)/etc/systemd/system/wazuh-dashboard.service find "$(TARGET_DIR)$(INSTALLATION_DIR)" -type d -exec chmod 750 {} \; diff --git a/dev-tools/build-packages/rpm/wazuh-dashboard.spec b/dev-tools/build-packages/rpm/wazuh-dashboard.spec index 3506f455e601..2c9496aaa053 100644 --- a/dev-tools/build-packages/rpm/wazuh-dashboard.spec +++ b/dev-tools/build-packages/rpm/wazuh-dashboard.spec @@ -54,6 +54,9 @@ useradd -g %{GROUP} %{USER} %build tar -xf %{DASHBOARD_FILE} +sed -i 's/OSD_NODE_OPTS_PREFIX/OSD_PATH_CONF="\/etc\/wazuh-dashboard" OSD_NODE_OPTS_PREFIX/g' "wazuh-dashboard-base/bin/opensearch-dashboards" +sed -i 's/OSD_USE_NODE_JS_FILE_PATH/OSD_PATH_CONF="\/etc\/wazuh-dashboard" OSD_USE_NODE_JS_FILE_PATH/g' "wazuh-dashboard-base/bin/opensearch-dashboards-keystore" + # ----------------------------------------------------------------------------- From b90134006411e6ac0e6bc868daa7d1df5c1b8544 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:51:03 -0300 Subject: [PATCH 50/51] modify workflow tag (#298) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 5449d26da9a8..f94fd68cc6fc 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,7 +103,7 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-2 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} From 2d46edd71c985780632ecb243ad740202deef5b1 Mon Sep 17 00:00:00 2001 From: Raul Del Pozo Moreno Date: Sat, 7 Sep 2024 01:36:19 +0200 Subject: [PATCH 51/51] Revert configuration change (#300) --- config/opensearch_dashboards.prod.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/config/opensearch_dashboards.prod.yml b/config/opensearch_dashboards.prod.yml index 930f061b3e75..dc49b17f74d0 100644 --- a/config/opensearch_dashboards.prod.yml +++ b/config/opensearch_dashboards.prod.yml @@ -1,13 +1,14 @@ server.host: 0.0.0.0 server.port: 443 -opensearch.hosts: https://127.0.0.1:9200 +opensearch.hosts: https://localhost:9200 opensearch.ssl.verificationMode: certificate +#opensearch.username: +#opensearch.password: opensearch.requestHeadersAllowlist: ["securitytenant","Authorization"] opensearch_security.multitenancy.enabled: false opensearch_security.readonly_mode.roles: ["kibana_read_only"] server.ssl.enabled: true -server.ssl.key: "/etc/wazuh-dashboard/certs/wazuh-dashboard-key.pem" -server.ssl.certificate: "/etc/wazuh-dashboard/certs/wazuh-dashboard.pem" +server.ssl.key: "/etc/wazuh-dashboard/certs/dashboard-key.pem" +server.ssl.certificate: "/etc/wazuh-dashboard/certs/dashboard.pem" opensearch.ssl.certificateAuthorities: ["/etc/wazuh-dashboard/certs/root-ca.pem"] uiSettings.overrides.defaultRoute: /app/wz-home -opensearch_security.cookie.secure: true
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
= ({ theme, darkMode }) => { .osdWelcomeText { display: inline-block; - font-size: 14px; + font-size: 24px; /* Wazuh */ + font-family: sans-serif; line-height: 40px !important; height: 40px !important; color: ${themeDefinition.euiColorDarkShade}; @@ -134,8 +135,8 @@ export const Styles: FunctionComponent = ({ theme, darkMode }) => { } .osdLoaderWrap svg { - width: 64px; - height: 64px; + width: 384px; /* Wazuh */ + height: 112px; /* Wazuh */ margin: auto; line-height: 1; } @@ -147,8 +148,8 @@ export const Styles: FunctionComponent = ({ theme, darkMode }) => { .osdProgress { display: inline-block; position: relative; - width: 32px; - height: 4px; + width: 256px; /* Wazuh */ + height: 10px; overflow: hidden; background-color: ${themeDefinition.euiColorLightestShade}; line-height: 1; @@ -157,7 +158,7 @@ export const Styles: FunctionComponent = ({ theme, darkMode }) => { .osdProgress:before { position: absolute; content: ''; - height: 4px; + height: 10px; /* Wazuh */ width: 100%; top: 0; bottom: 0; @@ -168,8 +169,8 @@ export const Styles: FunctionComponent = ({ theme, darkMode }) => { } .loadingLogoContainer { - height: 80px; - padding: 8px; + height: 150px; /* Wazuh */ + padding: 10px 10px 10px 10px; } .loadingLogo { diff --git a/src/core/server/rendering/views/template.test.tsx b/src/core/server/rendering/views/template.test.tsx index 39a3e1401ea3..dcc571384d72 100644 --- a/src/core/server/rendering/views/template.test.tsx +++ b/src/core/server/rendering/views/template.test.tsx @@ -25,6 +25,7 @@ function mockProps() { version: injectedMetadata.getOpenSearchDashboardsVersion(), buildNumber: 1, branch: injectedMetadata.getBasePath(), + wazuhVersion: injectedMetadata.getWazuhVersion(), basePath: '', serverBasePath: '', env: { @@ -34,6 +35,7 @@ function mockProps() { buildNum: 1, buildSha: '', dist: true, + wazuhVersion: '', }, mode: { name: 'production' as 'development' | 'production', diff --git a/src/core/server/rendering/views/template.tsx b/src/core/server/rendering/views/template.tsx index 8aa7903d8df1..5d3709283bd5 100644 --- a/src/core/server/rendering/views/template.tsx +++ b/src/core/server/rendering/views/template.tsx @@ -154,7 +154,9 @@ export const Template: FunctionComponent = ({ })} > {i18n('core.ui.welcomeMessage', { - defaultMessage: `Loading ${applicationTitle}`, + // Wazuh: change the default message to avoid + // showing the "Loading Wazuh" message twice. + defaultMessage: 'Loading ...', })}
{/* Show a progress bar if a static custom branded logo is used */} diff --git a/src/core/server/status/routes/integration_tests/status.test.ts b/src/core/server/status/routes/integration_tests/status.test.ts index 1045ca939c05..d52c895fa6b6 100644 --- a/src/core/server/status/routes/integration_tests/status.test.ts +++ b/src/core/server/status/routes/integration_tests/status.test.ts @@ -79,6 +79,7 @@ describe('GET /api/status', () => { buildSha: 'xsha', dist: true, version: '9.9.9-SNAPSHOT', + wazuhVersion: '4.2.0', }, serverName: 'xopensearchDashboards', uuid: 'xxxx-xxxxx', diff --git a/src/dev/build/lib/config.ts b/src/dev/build/lib/config.ts index c8750e9234b3..c182b2617dad 100644 --- a/src/dev/build/lib/config.ts +++ b/src/dev/build/lib/config.ts @@ -55,6 +55,7 @@ interface Package { workspaces: { packages: string[]; }; + wazuh: { version: string }; [key: string]: unknown; } diff --git a/src/dev/build/tasks/create_package_json_task.ts b/src/dev/build/tasks/create_package_json_task.ts index 8f9b41738eea..7b8d2a311a0b 100644 --- a/src/dev/build/tasks/create_package_json_task.ts +++ b/src/dev/build/tasks/create_package_json_task.ts @@ -51,6 +51,9 @@ export const CreatePackageJson: Task = { distributable: true, release: config.isRelease, }, + wazuh: { + version: pkg.wazuh.version, + }, repository: pkg.repository, engines: { node: pkg.engines.node, diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 53dc1869bd52..eb3ceff6f9e8 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -66,7 +66,7 @@ export const IGNORE_FILE_GLOBS = [ 'packages/opensearch-safer-lodash-set/**/*', // TODO fix file names in APM to remove these - + 'dev-tools/**/*', // packages for the ingest manager's api integration tests could be valid semver which has dashes ]; @@ -102,6 +102,7 @@ export const IGNORE_DIRECTORY_GLOBS = [ 'test/functional/fixtures/opensearch_archiver/visualize_source-filters', 'packages/osd-pm/src/utils/__fixtures__/*', 'src/dev/build/tasks/__fixtures__/*', + 'dev-tools/*', ]; /** diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap b/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap index 1bef984d56dd..c8d90d009555 100644 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap +++ b/src/plugins/advanced_settings/public/management_app/components/call_outs/__snapshots__/call_outs.test.tsx.snap @@ -15,7 +15,7 @@ exports[`CallOuts should render normally 1`] = ` >

diff --git a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx b/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx index c2a0d93612f2..efeca4b7cf45 100644 --- a/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/call_outs/call_outs.tsx @@ -50,11 +50,11 @@ export const CallOuts = () => {

diff --git a/src/plugins/dashboard/public/application/components/dashboard_listing/__snapshots__/dashboard_listing.test.tsx.snap b/src/plugins/dashboard/public/application/components/dashboard_listing/__snapshots__/dashboard_listing.test.tsx.snap index e6061d600f22..2449d40cfa33 100644 --- a/src/plugins/dashboard/public/application/components/dashboard_listing/__snapshots__/dashboard_listing.test.tsx.snap +++ b/src/plugins/dashboard/public/application/components/dashboard_listing/__snapshots__/dashboard_listing.test.tsx.snap @@ -152,14 +152,14 @@ exports[`dashboard listing hideWriteControls 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -480,6 +480,7 @@ exports[`dashboard listing hideWriteControls 1`] = ` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -826,6 +827,9 @@ exports[`dashboard listing hideWriteControls 1`] = ` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -1291,14 +1295,14 @@ exports[`dashboard listing render table listing with initial filters from URL 1` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -1619,6 +1623,7 @@ exports[`dashboard listing render table listing with initial filters from URL 1` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -1965,6 +1970,9 @@ exports[`dashboard listing render table listing with initial filters from URL 1` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -2491,14 +2499,14 @@ exports[`dashboard listing renders call to action when no dashboards exist 1`] = "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2819,6 +2827,7 @@ exports[`dashboard listing renders call to action when no dashboards exist 1`] = "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -3165,6 +3174,9 @@ exports[`dashboard listing renders call to action when no dashboards exist 1`] = "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -3691,14 +3703,14 @@ exports[`dashboard listing renders table rows 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -4019,6 +4031,7 @@ exports[`dashboard listing renders table rows 1`] = ` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -4365,6 +4378,9 @@ exports[`dashboard listing renders table rows 1`] = ` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -4891,14 +4907,14 @@ exports[`dashboard listing renders warning when listingLimit is exceeded 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -5219,6 +5235,7 @@ exports[`dashboard listing renders warning when listingLimit is exceeded 1`] = ` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -5565,6 +5582,9 @@ exports[`dashboard listing renders warning when listingLimit is exceeded 1`] = ` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { diff --git a/src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap b/src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap index a76a7963d484..612285b2b5ce 100644 --- a/src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap +++ b/src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap @@ -140,14 +140,14 @@ exports[`Dashboard top nav render in embed mode 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -372,6 +372,7 @@ exports[`Dashboard top nav render in embed mode 1`] = ` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -718,6 +719,9 @@ exports[`Dashboard top nav render in embed mode 1`] = ` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -1104,14 +1108,14 @@ exports[`Dashboard top nav render in embed mode, and force hide filter bar 1`] = "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -1336,6 +1340,7 @@ exports[`Dashboard top nav render in embed mode, and force hide filter bar 1`] = "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -1682,6 +1687,9 @@ exports[`Dashboard top nav render in embed mode, and force hide filter bar 1`] = "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -2068,14 +2076,14 @@ exports[`Dashboard top nav render in embed mode, components can be forced show b "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2300,6 +2308,7 @@ exports[`Dashboard top nav render in embed mode, components can be forced show b "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -2646,6 +2655,9 @@ exports[`Dashboard top nav render in embed mode, components can be forced show b "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -3032,14 +3044,14 @@ exports[`Dashboard top nav render in full screen mode with appended URL param bu "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -3264,6 +3276,7 @@ exports[`Dashboard top nav render in full screen mode with appended URL param bu "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -3610,6 +3623,9 @@ exports[`Dashboard top nav render in full screen mode with appended URL param bu "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -3996,14 +4012,14 @@ exports[`Dashboard top nav render in full screen mode, no componenets should be "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -4228,6 +4244,7 @@ exports[`Dashboard top nav render in full screen mode, no componenets should be "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -4574,6 +4591,9 @@ exports[`Dashboard top nav render in full screen mode, no componenets should be "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { @@ -4960,14 +4980,14 @@ exports[`Dashboard top nav render with all components 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -5192,6 +5212,7 @@ exports[`Dashboard top nav render with all components 1`] = ` "docLinks": Object { "DOC_LINK_VERSION": "mocked-test-branch", "OPENSEARCH_WEBSITE_URL": "https://opensearch.org/", + "WAZUH_DOC_VERSION": "4.x", "links": Object { "noDocumentation": Object { "addData": "https://opensearch.org/docs/mocked-test-branch", @@ -5538,6 +5559,9 @@ exports[`Dashboard top nav render with all components 1`] = ` "guide": "https://opensearch.org/docs/mocked-test-branchvisualize/viz-index/", }, }, + "wazuh": Object { + "index": "https://documentation.wazuh.com/4.x/index.html", + }, }, }, "embeddable": Object { diff --git a/src/plugins/home/opensearch_dashboards.json b/src/plugins/home/opensearch_dashboards.json index 7dc3adf0d2c7..f5bc5cd82d1e 100644 --- a/src/plugins/home/opensearch_dashboards.json +++ b/src/plugins/home/opensearch_dashboards.json @@ -3,7 +3,18 @@ "version": "opensearchDashboards", "server": true, "ui": true, - "requiredPlugins": ["data", "urlForwarding", "savedObjects"], - "optionalPlugins": ["usageCollection", "telemetry", "dataSource"], - "requiredBundles": ["opensearchDashboardsReact", "dataSourceManagement"] -} + "requiredPlugins": [ + "data", + "urlForwarding", + "savedObjects" + ], + "optionalPlugins": [ + "usageCollection", + "telemetry", + "dataSource" + ], + "requiredBundles": [ + "opensearchDashboardsReact", + "dataSourceManagement" + ] +} \ No newline at end of file diff --git a/src/plugins/home/public/application/components/_solutions_section.scss b/src/plugins/home/public/application/components/_solutions_section.scss index b6d74387547c..2c83becfae87 100644 --- a/src/plugins/home/public/application/components/_solutions_section.scss +++ b/src/plugins/home/public/application/components/_solutions_section.scss @@ -84,7 +84,7 @@ } .homSolutionPanel__icon { - background-color: $euiColorEmptyShade !important; + background-color: white !important; box-shadow: none !important; margin: 0 auto $euiSizeS; padding: $euiSizeS; diff --git a/src/plugins/home/public/application/components/home_app.js b/src/plugins/home/public/application/components/home_app.js index 366d162f02eb..6296dd9812d8 100644 --- a/src/plugins/home/public/application/components/home_app.js +++ b/src/plugins/home/public/application/components/home_app.js @@ -34,11 +34,7 @@ import PropTypes from 'prop-types'; import { Home } from './legacy/home'; import { Homepage } from './homepage'; import { FeatureDirectory } from './feature_directory'; -import { TutorialDirectory } from './tutorial_directory'; -import { Tutorial } from './tutorial/tutorial'; import { HashRouter as Router, Switch, Route } from 'react-router-dom'; -import { getTutorial } from '../load_tutorials'; -import { replaceTemplateStrings } from './tutorial/replace_template_strings'; import { getServices } from '../opensearch_dashboards_services'; import { useMount } from 'react-use'; import { USE_NEW_HOME_PAGE } from '../../../common/constants'; @@ -104,8 +100,6 @@ export function HomeApp({ directories, solutions }) { - - diff --git a/src/plugins/home/public/application/components/legacy/__snapshots__/home.test.js.snap b/src/plugins/home/public/application/components/legacy/__snapshots__/home.test.js.snap index 31df3b66efb5..ecf88b90b6bd 100644 --- a/src/plugins/home/public/application/components/legacy/__snapshots__/home.test.js.snap +++ b/src/plugins/home/public/application/components/legacy/__snapshots__/home.test.js.snap @@ -26,12 +26,6 @@ exports[`home change home route should render a link to change the default route - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ +`; + +exports[`home welcome stores skip welcome setting if skipped 1`] = ` +
+ + } + /> +
+ - - - - diff --git a/src/plugins/home/public/application/components/legacy/home.test.js b/src/plugins/home/public/application/components/legacy/home.test.js index 29303d3d5340..6c8200216680 100644 --- a/src/plugins/home/public/application/components/legacy/home.test.js +++ b/src/plugins/home/public/application/components/legacy/home.test.js @@ -91,7 +91,7 @@ describe('home', () => { expect(path).toMatch(/home:(welcome|newThemeModal):show/); return 'false'; }), - setItem: sinon.mock(), + setItem: jest.fn(), }, urlBasePath: 'goober', onOptInSeen() { @@ -306,23 +306,20 @@ describe('home', () => { expect(component).toMatchSnapshot(); }); - - test('stores skip welcome setting if skipped', async () => { + // Skip test because it is not used in Wazuh dashboards + test.skip('stores skip welcome setting if skipped', async () => { defaultProps.localStorage.getItem = sinon.spy(() => 'true'); const component = await renderHome({ find: () => Promise.resolve({ total: 0 }), }); - component.instance().skipWelcome(); - component.update(); - sinon.assert.calledWith(defaultProps.localStorage.setItem, 'home:welcome:show', 'false'); expect(component).toMatchSnapshot(); }); - - test('should show the normal home page if loading fails', async () => { + // Skip test because it is not used in Wazuh dashboards + test.skip('should show the normal home page if loading fails', async () => { defaultProps.localStorage.getItem = sinon.spy(() => 'true'); const component = await renderHome({ @@ -377,7 +374,7 @@ describe('home', () => { sinon.assert.calledWith(defaultProps.localStorage.getItem, 'home:newThemeModal:show'); - expect(component.find(NewThemeModal).exists()).toBeTruthy(); + expect(component.find(NewThemeModal).exists()).toBeFalsy(); expect(component).toMatchSnapshot(); }); test('should not show the new theme modal if v7 theme in use', async () => { diff --git a/src/plugins/home/public/application/components/legacy/solutions_section/__snapshots__/solution_title.test.tsx.snap b/src/plugins/home/public/application/components/legacy/solutions_section/__snapshots__/solution_title.test.tsx.snap index c88537eac658..4c4943d47882 100644 --- a/src/plugins/home/public/application/components/legacy/solutions_section/__snapshots__/solution_title.test.tsx.snap +++ b/src/plugins/home/public/application/components/legacy/solutions_section/__snapshots__/solution_title.test.tsx.snap @@ -11,7 +11,7 @@ exports[`SolutionTitle renders correctly by default 1`] = ` diff --git a/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.test.tsx b/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.test.tsx index a688fae4b284..f680873e6e0f 100644 --- a/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.test.tsx +++ b/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.test.tsx @@ -64,7 +64,7 @@ describe('SolutionTitle ', () => { expect(elements.length).toEqual(1); const img = elements.first(); - expect(img.prop('iconType')).toEqual(props.logos.Mark.url); + expect(img.prop('iconType')).toEqual('/ui/favicons/safari-pinned-tab.svg'); const titles = component.find('EuiTitle > h3'); expect(titles.length).toEqual(1); diff --git a/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.tsx b/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.tsx index c46d821bba28..665036fb758c 100644 --- a/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.tsx +++ b/src/plugins/home/public/application/components/legacy/solutions_section/solution_title.tsx @@ -76,8 +76,9 @@ export const SolutionTitle: FC = ({ subtitle, branding, logos }) => ( />
) : ( + // Wazuh logo in the overview card { category: 'data', icon: 'indexOpen', id: 'home_tutorial_directory', - showOnHomePage: true, + showOnHomePage: false, }) ); }); diff --git a/src/plugins/home/public/plugin.ts b/src/plugins/home/public/plugin.ts index 75b39dadd8c0..24af36333bc2 100644 --- a/src/plugins/home/public/plugin.ts +++ b/src/plugins/home/public/plugin.ts @@ -139,7 +139,8 @@ export class HomePublicPlugin urlForwarding.forwardApp('home', 'home'); const featureCatalogue = { ...this.featuresCatalogueRegistry.setup() }; - + // Disable sample data in home/view app directory + // To activate it again, remove visible() and change showOnHomePage to true. featureCatalogue.register({ id: 'home_tutorial_directory', title: i18n.translate('home.tutorialDirectory.featureCatalogueTitle', { @@ -149,9 +150,12 @@ export class HomePublicPlugin defaultMessage: 'Get started with sample data, visualizations, and dashboards.', }), icon: 'indexOpen', - showOnHomePage: true, + showOnHomePage: false, path: `${HOME_APP_BASE_PATH}#/tutorial_directory`, category: 'data' as FeatureCatalogueCategory.DATA, + visible() { + return false; + }, order: 500, }); diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap index a617fa0511e2..8a36dc08a89e 100644 --- a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/__snapshots__/empty_state.test.tsx.snap @@ -29,35 +29,7 @@ exports[`EmptyState should render normally 1`] = ` className="inpEmptyState__cardGrid" columns={3} responsive={true} - > - - - } - icon={ - - } - onClick={[Function]} - title={ - - } - /> - - + /> diff --git a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx index 96862e59ffa5..4a1d7f518e05 100644 --- a/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx +++ b/src/plugins/index_pattern_management/public/components/index_pattern_table/empty_state/empty_state.tsx @@ -172,25 +172,6 @@ export const EmptyState = ({ /> */} {getMlCardState() !== MlCardState.HIDDEN ? mlCard : <>} - - navigateToApp('home', { path: '#/tutorial_directory/sampleData' })} - icon={} - title={ - - } - description={ - - } - /> -
diff --git a/src/plugins/management/public/components/landing/landing.tsx b/src/plugins/management/public/components/landing/landing.tsx index 5557eb7e9019..5ec74dc538bc 100644 --- a/src/plugins/management/public/components/landing/landing.tsx +++ b/src/plugins/management/public/components/landing/landing.tsx @@ -68,7 +68,7 @@ export const ManagementLandingPage = ({ setBreadcrumbs }: ManagementLandingPageP
diff --git a/src/plugins/opensearch_dashboards_overview/common/index.ts b/src/plugins/opensearch_dashboards_overview/common/index.ts index 79a90f2794c1..69c0977dce5e 100644 --- a/src/plugins/opensearch_dashboards_overview/common/index.ts +++ b/src/plugins/opensearch_dashboards_overview/common/index.ts @@ -30,5 +30,5 @@ export const PLUGIN_ID = 'opensearchDashboardsOverview'; export const PLUGIN_NAME = 'Overview'; -export const PLUGIN_PATH = `/app/opensearch_dashboards_overview`; +export const PLUGIN_PATH = `/app/home/`; export const PLUGIN_ICON = 'inputOutput'; diff --git a/src/plugins/opensearch_dashboards_overview/public/components/getting_started/__snapshots__/getting_started.test.tsx.snap b/src/plugins/opensearch_dashboards_overview/public/components/getting_started/__snapshots__/getting_started.test.tsx.snap index 9df3bb12caec..f2a26c2fa3b1 100644 --- a/src/plugins/opensearch_dashboards_overview/public/components/getting_started/__snapshots__/getting_started.test.tsx.snap +++ b/src/plugins/opensearch_dashboards_overview/public/components/getting_started/__snapshots__/getting_started.test.tsx.snap @@ -168,19 +168,6 @@ exports[`GettingStarted dark mode on 1`] = ` - - - - -
- - - - -
= ({ addBasePath, isDarkTheme, apps }) => - - - - - -
diff --git a/src/plugins/opensearch_dashboards_overview/public/components/overview/__snapshots__/overview.test.tsx.snap b/src/plugins/opensearch_dashboards_overview/public/components/overview/__snapshots__/overview.test.tsx.snap index 1619a4fea3ff..88aa7cbffce9 100644 --- a/src/plugins/opensearch_dashboards_overview/public/components/overview/__snapshots__/overview.test.tsx.snap +++ b/src/plugins/opensearch_dashboards_overview/public/components/overview/__snapshots__/overview.test.tsx.snap @@ -970,14 +970,14 @@ exports[`Overview renders with news, solutions, and features 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -1317,7 +1317,7 @@ exports[`Overview renders with news, solutions, and features 1`] = ` ], } } - path="/app/opensearch_dashboards_overview" + path="/app/home/" />
@@ -1455,14 +1455,14 @@ exports[`Overview renders with news, with solutions, and without features 1`] = "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -1858,7 +1858,7 @@ exports[`Overview renders with news, with solutions, and without features 1`] = ], } } - path="/app/opensearch_dashboards_overview" + path="/app/home/" />
@@ -1940,14 +1940,14 @@ exports[`Overview renders with news, without solutions, and with features 1`] = "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { @@ -2094,75 +2094,6 @@ exports[`Overview renders with news, without solutions, and with features 1`] = - - -
diff --git a/src/plugins/opensearch_dashboards_overview/public/components/overview/overview.tsx b/src/plugins/opensearch_dashboards_overview/public/components/overview/overview.tsx index 30df4dbe8146..6cfcc7ec4f29 100644 --- a/src/plugins/opensearch_dashboards_overview/public/components/overview/overview.tsx +++ b/src/plugins/opensearch_dashboards_overview/public/components/overview/overview.tsx @@ -56,7 +56,6 @@ import { } from '../../../../../../src/plugins/home/public'; import { PLUGIN_ID, PLUGIN_PATH } from '../../../common'; import { AppPluginStartDependencies } from '../../types'; -import { AddData } from '../add_data'; import { GettingStarted } from '../getting_started'; import { ManageData } from '../manage_data'; import { NewsFeed } from '../news_feed'; @@ -264,10 +263,6 @@ export const Overview: FC = ({ newsFetchResult, solutions, features, logo : 'osdOverviewData--expanded' }`} > - - - - diff --git a/src/plugins/opensearch_dashboards_overview/public/plugin.ts b/src/plugins/opensearch_dashboards_overview/public/plugin.ts index e38282ff06d6..d8ac61c6d7e2 100644 --- a/src/plugins/opensearch_dashboards_overview/public/plugin.ts +++ b/src/plugins/opensearch_dashboards_overview/public/plugin.ts @@ -77,13 +77,13 @@ export class OpenSearchDashboardsOverviewPlugin return hasOpenSearchDashboardsApp; }), distinct(), - map((hasOpenSearchDashboardsApp) => { + map(() => { return () => { - if (!hasOpenSearchDashboardsApp) { - return { status: AppStatus.inaccessible, navLinkStatus: AppNavLinkStatus.hidden }; - } else { - return { status: AppStatus.accessible, navLinkStatus: AppNavLinkStatus.default }; - } + // Wazuh: Hide the OpenSearch Dashboards Overview app + return { + status: AppStatus.inaccessible, + navLinkStatus: AppNavLinkStatus.hidden, + }; }; }) ); diff --git a/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.test.tsx b/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.test.tsx index 2e27ebd0cb6b..11983e7b067d 100644 --- a/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.test.tsx +++ b/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.test.tsx @@ -121,8 +121,8 @@ describe('OverviewPageHeader ', () => { expect(head.length).toBe(1); expect(head.first().text()).toEqual(mockTitle); }); - - it('renders with the toolbar by default', () => { + // Skip test because it is not used in Wazuh dashboards + it.skip('renders with the toolbar by default', () => { const props = { ...mockProps(), }; @@ -141,8 +141,8 @@ describe('OverviewPageHeader ', () => { // Would contain only the "Add Data" button expect(component).toMatchSnapshot(); }); - - it('renders with the toolbar when it is explicitly asked not to be hidden', () => { + // Skip test because it is not used in Wazuh dashboards + it.skip('renders with the toolbar when it is explicitly asked not to be hidden', () => { const props = { ...mockProps(), hideToolbar: false, diff --git a/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.tsx b/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.tsx index a636f7ecdb7d..8208b851a8a1 100644 --- a/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.tsx +++ b/src/plugins/opensearch_dashboards_react/public/overview_page/overview_page_header/overview_page_header.tsx @@ -111,24 +111,6 @@ export const OverviewPageHeader: FC = ({ {!hideToolbar && ( - - - - {i18n.translate( - 'opensearch-dashboards-react.osdOverviewPageHeader.addDataButtonLabel', - { - defaultMessage: 'Add data', - } - )} - - - - {showManagementLink && isManagementEnabled ? ( diff --git a/test/functional/apps/home/_sample_data.ts b/test/functional/apps/home/_sample_data.ts index a790a884ccbe..17804a9bd3d4 100644 --- a/test/functional/apps/home/_sample_data.ts +++ b/test/functional/apps/home/_sample_data.ts @@ -42,7 +42,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dashboardExpect = getService('dashboardExpect'); const PageObjects = getPageObjects(['common', 'header', 'home', 'dashboard', 'timePicker']); - describe('sample data', function describeIndexTests() { + /** + * This test suite is skipped because the seccion of the sample data set is not available in the UI. + */ + describe.skip('sample data', function describeIndexTests() { before(async () => { await security.testUser.setRoles([ 'opensearch_dashboards_admin', diff --git a/test/functional/apps/visualize/_custom_branding.ts b/test/functional/apps/visualize/_custom_branding.ts index 37f07e932ee5..9b161da01718 100644 --- a/test/functional/apps/visualize/_custom_branding.ts +++ b/test/functional/apps/visualize/_custom_branding.ts @@ -28,7 +28,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const expectedWelcomeMessage = 'Welcome to OpenSearch'; describe('OpenSearch Dashboards branding configuration', function customHomeBranding() { - describe('should render overview page', async () => { + /** + * This test is skipped because the overview page is not available. + */ + describe.skip('should render overview page', async () => { this.tags('includeFirefox'); before(async function () { @@ -81,7 +84,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - it('with customized logo', async () => { + /** + * This test is omitted because the welcome page has been removed. + */ + it.skip('with customized logo', async () => { await testSubjects.existOrFail('welcomeCustomLogo'); const actualLabel = await testSubjects.getAttribute( 'welcomeCustomLogo', @@ -90,7 +96,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(actualLabel.toUpperCase()).to.equal(expectedMarkLogo.toUpperCase()); }); - it('with customized title', async () => { + it.skip('with customized title', async () => { await testSubjects.existOrFail('welcomeCustomTitle'); const actualLabel = await testSubjects.getAttribute( 'welcomeCustomTitle', @@ -99,7 +105,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(actualLabel.toUpperCase()).to.equal(expectedWelcomeMessage.toUpperCase()); }); - it('with customized logo in dark mode', async () => { + it.skip('with customized logo in dark mode', async () => { await PageObjects.common.navigateToApp('management/opensearch-dashboards/settings'); await PageObjects.settings.toggleAdvancedSettingCheckbox('theme:darkMode'); await PageObjects.common.navigateToApp('home'); From 82200efa6fb18a602b9333dd02d6039a302b7b10 Mon Sep 17 00:00:00 2001 From: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:10:33 +0100 Subject: [PATCH 08/51] Add script test packages (#133) --- .../build_wazuh_dashboard_with_plugins.yml | 70 ++++++++ dev-tools/test-packages/deb/Dockerfile | 7 + dev-tools/test-packages/rpm/Dockerfile | 11 ++ dev-tools/test-packages/test-packages.sh | 169 ++++++++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 dev-tools/test-packages/deb/Dockerfile create mode 100644 dev-tools/test-packages/rpm/Dockerfile create mode 100644 dev-tools/test-packages/test-packages.sh diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 8ab9a563409e..9884e40757cf 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -210,3 +210,73 @@ jobs: name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm path: ${{ env.CURRENT_DIR }}/dev-tools/build-packages/rpm/output/wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm retention-days: 30 + + + test-package-deb: + needs: [build-deb-package] + runs-on: ubuntu-latest + name: Test packages + strategy: + fail-fast: false + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup variables + run: | + echo "CURRENT_DIR=$(pwd -P)" >> $GITHUB_ENV + echo "VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Download deb package + uses: actions/download-artifact@v3 + with: + name: wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_amd64.deb + path: ${{ env.CURRENT_DIR }}/dev-tools/test-packages/deb + + - name: Run test + run: | + cd ${{ env.CURRENT_DIR }}/dev-tools/test-packages + bash ./test-packages.sh \ + -p wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_amd64.deb + + + test-package-rpm: + needs: [build-rpm-package] + runs-on: ubuntu-latest + name: Test packages + strategy: + fail-fast: false + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - name: Setup variables + run: | + echo "CURRENT_DIR=$(pwd -P)" >> $GITHUB_ENV + echo "VERSION=$(yarn --silent wzd-version)" >> $GITHUB_ENV + echo "REVISION=$(yarn --silent wzd-revision)" >> $GITHUB_ENV + + - name: Download rpm package + uses: actions/download-artifact@v3 + with: + name: wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm + path: ${{ env.CURRENT_DIR }}/dev-tools/test-packages/rpm + + - name: Run test + run: | + cd ${{ env.CURRENT_DIR }}/dev-tools/test-packages + bash ./test-packages.sh \ + -p wazuh-dashboard-${{ env.VERSION }}-${{ env.REVISION }}.x86_64.rpm diff --git a/dev-tools/test-packages/deb/Dockerfile b/dev-tools/test-packages/deb/Dockerfile new file mode 100644 index 000000000000..838dc18e398c --- /dev/null +++ b/dev-tools/test-packages/deb/Dockerfile @@ -0,0 +1,7 @@ +FROM ubuntu:latest +ARG PACKAGE +RUN mkdir -p /tmp +RUN apt-get update --fix-missing +RUN apt-get install -y curl libcap2-bin +COPY ${PACKAGE} /tmp/wazuh.deb +RUN dpkg -i /tmp/wazuh.deb diff --git a/dev-tools/test-packages/rpm/Dockerfile b/dev-tools/test-packages/rpm/Dockerfile new file mode 100644 index 000000000000..36c0500bb9ce --- /dev/null +++ b/dev-tools/test-packages/rpm/Dockerfile @@ -0,0 +1,11 @@ +FROM centos:latest + +RUN mkdir -p /tmp +FROM centos +ARG PACKAGE +RUN cd /etc/yum.repos.d/ +RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* +RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* +RUN yum update -y +COPY ${PACKAGE} /tmp/wazuh.rpm +RUN yum install /tmp/wazuh.rpm -y diff --git a/dev-tools/test-packages/test-packages.sh b/dev-tools/test-packages/test-packages.sh new file mode 100644 index 000000000000..ca0eea5831f3 --- /dev/null +++ b/dev-tools/test-packages/test-packages.sh @@ -0,0 +1,169 @@ +#!/bin/sh + +# Package name +PACKAGE="" +# Container name +CONTAINER_NAME="wazuh-dashboard" +# Files to check +FILES="/etc/wazuh-dashboard/opensearch_dashboards.yml /usr/share/wazuh-dashboard" +# Owner of the files +FILE_OWNER="wazuh-dashboard" + +# Remove container and image +clean() { + docker stop $CONTAINER_NAME + docker rmi $CONTAINER_NAME +} + +# Check if files exist and are owned by wazuh-dashboard +files_exist() { + for FILE in $FILES; do + if docker exec $CONTAINER_NAME ls $FILE >/dev/null 2>&1; then + file_owner=$(docker exec $CONTAINER_NAME stat -c '%U' $FILE) + if [ "$file_owner" != "$FILE_OWNER" ]; then + echo "ERROR: $FILE is owned by $file_owner instead of $FILE_OWNER" + clean + exit 1 + fi + echo "$FILE exist and is owned by $FILE_OWNER" + else + echo "ERROR: $FILE does not exist" + clean + exit 1 + fi + done +} + +# Check if opensearch_dashboards.yml is the same as the one in the package +check_opensearch_dashboard_yml() { + docker cp ../../config/opensearch_dashboards.prod.yml $CONTAINER_NAME:/tmp/opensearch_dashboards.yml + + diff_opensearch_dashboard_yml=$(docker exec $CONTAINER_NAME diff /etc/wazuh-dashboard/opensearch_dashboards.yml /tmp/opensearch_dashboards.yml) + + if [ -n "$diff_opensearch_dashboard_yml" ]; then + echo "ERROR: opensearch_dashboards.yml is not the same as the one in the package" + echo $diff_opensearch_dashboard_yml + clean + exit 1 + fi + echo $(docker exec $CONTAINER_NAME diff /etc/wazuh-dashboard/opensearch_dashboards.yml /tmp/opensearch_dashboards.yml) + echo "opensearch_dashboards.yml is the same as the one in the package" +} + +# Check if metadata is correct for deb packages +check_metadata_deb() { + + IFS='_' read -r -a arrayNameFile <<< "$PACKAGE" + metadataVersion=$(docker exec $CONTAINER_NAME apt show wazuh-dashboard | grep Version | awk '{print $2}') + metadataPackage=$(docker exec $CONTAINER_NAME apt show wazuh-dashboard | grep Package | awk '{print $2}') + metadataStatus=$(docker exec $CONTAINER_NAME apt show wazuh-dashboard | grep Status) + + # Check if metadata is correct + if [ "${arrayNameFile[1]}" != "$metadataVersion" ]; then + echo "ERROR: metadata version is not the same as the one in the package" + echo "metadata version: $metadataVersion" + echo "package version: ${arrayNameFile[1]}" + clean + exit 1 + elif [ "${arrayNameFile[0]}" != "$metadataPackage" ]; then + echo "ERROR: metadata package is not the same as the one in the package" + echo "metadata package: $metadataPackage" + echo "package package: ${arrayNameFile[0]}" + clean + exit 1 + elif [ "$metadataStatus" != "Status: install ok installed" ]; then + echo "ERROR: metadata status is not 'Status: install ok installed'" + echo "metadata status: $metadataStatus" + clean + exit 1 + fi + + echo "metadata version is correct: $metadataVersion" + echo "metadata package is correct: $metadataPackage" + echo "metadata status is $metadataStatus" +} + +check_metadata_rpm() { + metadataVersion=$(docker exec $CONTAINER_NAME rpm -q --qf '%{VERSION}-%{RELEASE}' wazuh-dashboard) + metadataPackage=$(docker exec $CONTAINER_NAME rpm -q --qf '%{NAME}' wazuh-dashboard) + + # Check if metadata is correct + if [[ $PACKAGE != *"$metadataVersion"* ]]; then + echo "ERROR: metadata version is not the same as the one in the package" + echo "metadata version: $metadataVersion" + echo "package version: $PACKAGE" + clean + exit 1 + elif [[ $PACKAGE != "$metadataPackage"* ]]; then + echo "ERROR: metadata package is not the same as the one in the package" + echo "metadata package: $metadataPackage" + echo "package package: $PACKAGE" + clean + exit 1 + fi + + echo "metadata version is correct: $metadataVersion" + echo "metadata package is correct: $metadataPackage" +} + +# Run test +test() { + + if [[ $PACKAGE == *".deb" ]]; then + docker build --build-arg PACKAGE=$PACKAGE -t $CONTAINER_NAME ./deb/ + docker run -it --rm -d --name $CONTAINER_NAME $CONTAINER_NAME + check_metadata_deb + elif [[ $PACKAGE == *".rpm" ]]; then + docker build --build-arg PACKAGE=$PACKAGE -t $CONTAINER_NAME ./rpm/ + docker run -it --rm -d --name $CONTAINER_NAME $CONTAINER_NAME + check_metadata_rpm + else + echo "ERROR: $PACKAGE is not a valid package (valid packages are .deb and .rpm ))" + exit 1 + fi + + files_exist + + check_opensearch_dashboard_yml +} + +# Show help +help() { + echo + echo "Usage: $0 [OPTIONS]" + echo + echo " -p, --package Set Wazuh Dashboard rpm package name,which has to be in the /dev-tools/test-packages// folder." + echo + exit $1 +} + +main() { + while [ -n "${1}" ]; do + case "${1}" in + "-h" | "--help") + help 0 + ;; + "-p" | "--package") + if [ -n "${2}" ]; then + PACKAGE="${2}" + shift 2 + else + help 1 + fi + ;; + *) + help 1 + ;; + esac + done + + if [ -z "$PACKAGE" ] ; then + help 1 + fi + + test + + clean +} + +main "$@" From c96eeab7c75b3b0ba4aaf54fa3a807031bf26f1d Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:21:59 -0300 Subject: [PATCH 09/51] Fix inconsistent help menu (#139) --- .../src/integration_tests/build.test.ts | 12 + src/core/public/chrome/chrome_service.tsx | 1 + src/core/public/chrome/constants.ts | 5 + .../header/__snapshots__/header.test.tsx.snap | 6 + .../header_help_menu.test.tsx.snap | 234 +++++++++++++----- .../public/chrome/ui/header/header.test.tsx | 1 + src/core/public/chrome/ui/header/header.tsx | 2 + .../ui/header/header_help_menu.test.tsx | 1 + .../chrome/ui/header/header_help_menu.tsx | 43 +++- .../core_app/assets/logos/google_groups.svg | 29 +++ .../core_app/assets/logos/icon_dark.svg | 17 ++ .../core_app/assets/logos/icon_light.svg | 13 + src/core/tsconfig.json | 10 +- 13 files changed, 295 insertions(+), 79 deletions(-) create mode 100644 src/core/server/core_app/assets/logos/google_groups.svg create mode 100644 src/core/server/core_app/assets/logos/icon_dark.svg create mode 100644 src/core/server/core_app/assets/logos/icon_light.svg diff --git a/packages/osd-plugin-helpers/src/integration_tests/build.test.ts b/packages/osd-plugin-helpers/src/integration_tests/build.test.ts index 780682d27658..37e5b3aacd98 100644 --- a/packages/osd-plugin-helpers/src/integration_tests/build.test.ts +++ b/packages/osd-plugin-helpers/src/integration_tests/build.test.ts @@ -101,9 +101,15 @@ it('builds a generated plugin into a viable archive', async () => { info running @osd/optimizer │ info initialized, 0 bundles cached │ info starting worker [1 bundle] + │ warn worker stderr Browserslist: caniuse-lite is outdated. Please run: + │ warn worker stderr npx update-browserslist-db@latest + │ warn worker stderr Why you should do it regularly: https://github.com/browserslist/update-db#readme │ succ 1 bundles compiled successfully after
+ - Wazuh documentation + Documentation
- +
@@ -1828,7 +1842,7 @@ exports[`Header help menu hides survey link 1`] = ` /> @@ -1838,12 +1852,12 @@ exports[`Header help menu hides survey link 1`] = ` - Open an issue in GitHub + Google Group @@ -1992,13 +2006,14 @@ exports[`Header help menu hides survey link 1`] = ` > @@ -2006,6 +2021,7 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonEmpty__content" iconSide="left" iconSize="s" + iconType="/ui/logos/icon_light.svg" textProps={ Object { "className": "euiButtonEmpty__text", @@ -2015,15 +2031,28 @@ exports[`Header help menu hides survey link 1`] = ` + + + - Wazuh documentation + Documentation @@ -2039,19 +2068,22 @@ exports[`Header help menu hides survey link 1`] = ` - + @@ -2107,7 +2152,7 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonEmpty__content" iconSide="left" iconSize="s" - iconType="logoGithub" + iconType="/ui/logos/google_groups.svg" textProps={ Object { "className": "euiButtonEmpty__text", @@ -2121,12 +2166,12 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonContent__icon" color="inherit" size="s" - type="logoGithub" + type="/ui/logos/google_groups.svg" > @@ -2134,11 +2179,11 @@ exports[`Header help menu hides survey link 1`] = ` className="euiButtonEmpty__text" > - Open an issue in GitHub + Google Group @@ -2162,6 +2207,7 @@ exports[`Header help menu hides survey link 1`] = ` exports[`Header help menu renders survey link 1`] = ` + - Wazuh documentation + Documentation
- +
+ - Give feedback + Projects on Github @@ -4008,7 +4072,7 @@ exports[`Header help menu renders survey link 1`] = ` /> @@ -4018,12 +4082,12 @@ exports[`Header help menu renders survey link 1`] = ` - Open an issue in GitHub + Google Group @@ -4172,13 +4236,14 @@ exports[`Header help menu renders survey link 1`] = ` > @@ -4186,6 +4251,7 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__content" iconSide="left" iconSize="s" + iconType="/ui/logos/icon_light.svg" textProps={ Object { "className": "euiButtonEmpty__text", @@ -4195,15 +4261,28 @@ exports[`Header help menu renders survey link 1`] = ` + + + - Wazuh documentation + Documentation @@ -4219,19 +4298,22 @@ exports[`Header help menu renders survey link 1`] = ` - + @@ -4280,6 +4376,7 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__content" iconSide="left" iconSize="s" + iconType="logoGithub" textProps={ Object { "className": "euiButtonEmpty__text", @@ -4289,15 +4386,28 @@ exports[`Header help menu renders survey link 1`] = ` + + + - Give feedback + Projects on Github @@ -4321,14 +4431,14 @@ exports[`Header help menu renders survey link 1`] = ` @@ -4336,7 +4446,7 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__content" iconSide="left" iconSize="s" - iconType="logoGithub" + iconType="/ui/logos/google_groups.svg" textProps={ Object { "className": "euiButtonEmpty__text", @@ -4350,12 +4460,12 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonContent__icon" color="inherit" size="s" - type="logoGithub" + type="/ui/logos/google_groups.svg" > @@ -4363,11 +4473,11 @@ exports[`Header help menu renders survey link 1`] = ` className="euiButtonEmpty__text" > - Open an issue in GitHub + Google Group diff --git a/src/core/public/chrome/ui/header/header.test.tsx b/src/core/public/chrome/ui/header/header.test.tsx index 0d3bc7e70d45..deb60f380eee 100644 --- a/src/core/public/chrome/ui/header/header.test.tsx +++ b/src/core/public/chrome/ui/header/header.test.tsx @@ -73,6 +73,7 @@ function mockProps() { branding: {}, survey: '/', logos: chromeServiceMock.createStartContract().logos, + darkmode: false, sidecarConfig$: new BehaviorSubject({ dockedMode: SIDECAR_DOCKED_MODE.RIGHT, paddingSize: 640, diff --git a/src/core/public/chrome/ui/header/header.tsx b/src/core/public/chrome/ui/header/header.tsx index 8ff9529288bd..2ebb39e134a9 100644 --- a/src/core/public/chrome/ui/header/header.tsx +++ b/src/core/public/chrome/ui/header/header.tsx @@ -93,6 +93,7 @@ export interface HeaderProps { branding: ChromeBranding; logos: Logos; survey: string | undefined; + darkmode: boolean; sidecarConfig$: Observable; } @@ -245,6 +246,7 @@ export function Header({ opensearchDashboardsDocLink={opensearchDashboardsDocLink} opensearchDashboardsVersion={opensearchDashboardsVersion} surveyLink={survey} + darkmode={observables.darkmode} /> diff --git a/src/core/public/chrome/ui/header/header_help_menu.test.tsx b/src/core/public/chrome/ui/header/header_help_menu.test.tsx index fbcd47367120..2099b9a2a471 100644 --- a/src/core/public/chrome/ui/header/header_help_menu.test.tsx +++ b/src/core/public/chrome/ui/header/header_help_menu.test.tsx @@ -15,6 +15,7 @@ function mockProps() { opensearchDashboardsDocLink: '/doclink', opensearchDashboardsVersion: '1.0', useDefaultContent: true, + darkmode: false, }; } diff --git a/src/core/public/chrome/ui/header/header_help_menu.tsx b/src/core/public/chrome/ui/header/header_help_menu.tsx index 33b858177118..44183dd64e56 100644 --- a/src/core/public/chrome/ui/header/header_help_menu.tsx +++ b/src/core/public/chrome/ui/header/header_help_menu.tsx @@ -50,7 +50,7 @@ import { ExclusiveUnion } from '@elastic/eui'; import { combineLatest } from 'rxjs'; import { HeaderExtension } from './header_extension'; import { ChromeHelpExtension } from '../../chrome_service'; -import { GITHUB_CREATE_ISSUE_LINK } from '../../constants'; +import { WAZUH_DOCUMENTATION_URL } from '../../constants'; /** @public */ export type ChromeHelpExtensionMenuGitHubLink = EuiButtonEmptyProps & { @@ -123,6 +123,7 @@ interface Props { useDefaultContent?: boolean; opensearchDashboardsDocLink: string; surveyLink?: string; + darkmode: boolean; } interface State { @@ -198,26 +199,38 @@ class HeaderHelpMenuUI extends Component { intl, opensearchDashboardsVersion, useDefaultContent, - opensearchDashboardsDocLink, surveyLink, + darkmode, } = this.props; - const { helpExtension, helpSupportUrl } = this.state; + const { helpExtension } = this.state; const defaultContent = useDefaultContent ? ( - + - + @@ -225,10 +238,16 @@ class HeaderHelpMenuUI extends Component { {surveyLink && (
- + @@ -238,15 +257,15 @@ class HeaderHelpMenuUI extends Component { diff --git a/src/core/server/core_app/assets/logos/google_groups.svg b/src/core/server/core_app/assets/logos/google_groups.svg new file mode 100644 index 000000000000..934cf1d86d56 --- /dev/null +++ b/src/core/server/core_app/assets/logos/google_groups.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/src/core/server/core_app/assets/logos/icon_dark.svg b/src/core/server/core_app/assets/logos/icon_dark.svg new file mode 100644 index 000000000000..966e74def86c --- /dev/null +++ b/src/core/server/core_app/assets/logos/icon_dark.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/src/core/server/core_app/assets/logos/icon_light.svg b/src/core/server/core_app/assets/logos/icon_light.svg new file mode 100644 index 000000000000..cc9df8577f88 --- /dev/null +++ b/src/core/server/core_app/assets/logos/icon_light.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json index 3281d2f19cfe..fedd701d7e3c 100644 --- a/src/core/tsconfig.json +++ b/src/core/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "./target/types", "emitDeclarationOnly": true, "declaration": true, - "declarationMap": true + "declarationMap": true, + "rootDir": "../../" }, "include": [ "public/**/*", @@ -15,9 +16,8 @@ "test_helpers/**/*", "utils/**/*", "index.ts", - "typings.ts" + "typings.ts", + "../../package.json" ], - "references": [ - { "path": "../test_utils/" } - ] + "references": [{ "path": "../test_utils/" }] } From ac225fcd7c1d9e317ba048d5c19a63bdbacb0c9d Mon Sep 17 00:00:00 2001 From: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Date: Tue, 20 Feb 2024 21:07:36 +0100 Subject: [PATCH 10/51] 140 update the repo with the latest changes of wazuh dashboard (#141) --- .../build-packages/base/generate_base.sh | 35 ++ .../__snapshots__/get_logos.test.ts.snap | 72 +-- src/core/common/logos/get_logos.ts | 24 +- src/core/public/chrome/chrome_service.tsx | 2 +- .../collapsible_nav.test.tsx.snap | 414 +++++++++--------- .../header/__snapshots__/header.test.tsx.snap | 280 ++++++------ .../__snapshots__/header_logo.test.tsx.snap | 4 +- .../__snapshots__/home_icon.test.tsx.snap | 8 +- .../chrome/ui/header/collapsible_nav.test.tsx | 23 +- .../chrome/ui/header/collapsible_nav.tsx | 2 +- .../chrome/ui/header/header_logo.test.tsx | 2 +- .../public/chrome/ui/header/header_logo.tsx | 2 +- .../chrome/ui/header/home_icon.test.tsx | 6 +- .../public/chrome/ui/header/home_icon.tsx | 6 +- .../public/chrome/ui/header/home_loader.tsx | 2 +- .../core_app/assets/logos/opensearch.svg | 12 - .../assets/logos/opensearch_center_mark.svg | 6 - .../logos/opensearch_center_mark_on_dark.svg | 6 - .../logos/opensearch_center_mark_on_light.svg | 6 - .../assets/logos/opensearch_dashboards.svg | 13 - .../logos/opensearch_dashboards_on_dark.svg | 13 - .../logos/opensearch_dashboards_on_light.svg | 13 - .../core_app/assets/logos/opensearch_mark.svg | 6 - .../assets/logos/opensearch_mark_on_dark.svg | 6 - .../assets/logos/opensearch_mark_on_light.svg | 6 - .../assets/logos/opensearch_on_dark.svg | 12 - .../assets/logos/opensearch_on_light.svg | 12 - .../server/core_app/assets/logos/wazuh.svg | 13 + .../assets/logos/wazuh_center_mark.svg | 13 + .../logos/wazuh_center_mark_on_dark.svg | 14 + .../logos/wazuh_center_mark_on_light.svg | 13 + .../assets/logos/wazuh_dashboards.svg | 23 + .../assets/logos/wazuh_dashboards_on_dark.svg | 32 ++ .../logos/wazuh_dashboards_on_light.svg | 23 + .../core_app/assets/logos/wazuh_mark.svg | 13 + .../assets/logos/wazuh_mark_on_dark.svg | 14 + .../assets/logos/wazuh_mark_on_light.svg | 13 + .../core_app/assets/logos/wazuh_on_dark.svg | 14 + .../core_app/assets/logos/wazuh_on_light.svg | 13 + .../__snapshots__/template.test.tsx.snap | 16 +- src/core/utils/default_app_categories.ts | 18 +- .../dashboard_listing.test.tsx.snap | 120 ++--- .../dashboard_top_nav.test.tsx.snap | 144 +++--- src/plugins/dashboard/public/plugin.tsx | 4 +- src/plugins/discover/public/plugin.ts | 4 +- .../__snapshots__/welcome.test.tsx.snap | 8 +- src/plugins/management/public/plugin.ts | 4 +- .../management_overview/public/plugin.ts | 2 + .../__snapshots__/overview.test.tsx.snap | 72 +-- .../exit_full_screen_button.test.tsx.snap | 6 +- src/plugins/visualize/public/plugin.ts | 4 +- test/functional/apps/home/_home.ts | 8 +- test/functional/apps/home/_navigation.ts | 3 + .../apps/visualize/_custom_branding.ts | 23 +- test/functional/page_objects/header_page.ts | 23 +- 55 files changed, 909 insertions(+), 741 deletions(-) delete mode 100644 src/core/server/core_app/assets/logos/opensearch.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_center_mark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_center_mark_on_dark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_center_mark_on_light.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_dashboards.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_dashboards_on_dark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_dashboards_on_light.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_mark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_mark_on_dark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_mark_on_light.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_on_dark.svg delete mode 100644 src/core/server/core_app/assets/logos/opensearch_on_light.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_center_mark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_center_mark_on_dark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_center_mark_on_light.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_dashboards.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_dashboards_on_dark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_dashboards_on_light.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_mark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_mark_on_dark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_mark_on_light.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_on_dark.svg create mode 100644 src/core/server/core_app/assets/logos/wazuh_on_light.svg diff --git a/dev-tools/build-packages/base/generate_base.sh b/dev-tools/build-packages/base/generate_base.sh index ad80a08c6c4b..1580cf4d1d17 100755 --- a/dev-tools/build-packages/base/generate_base.sh +++ b/dev-tools/build-packages/base/generate_base.sh @@ -144,6 +144,41 @@ build() { fi done + + # Move installed plugins from categories after generating the package + category_explore='{id:"explore",label:"Explore",order:100,euiIconType:"search"}' + category_dashboard_management='{id:"management",label:"Index management",order:5e3,euiIconType:"managementApp"}' + + # Replace app category to Reporting app + sed -i -e "s|category:{id:\"opensearch\",label:_i18n.i18n.translate(\"opensearch.reports.categoryName\",{defaultMessage:\"OpenSearch Plugins\"}),order:2e3}|category:${category_explore}|" ./plugins/reportsDashboards/target/public/reportsDashboards.plugin.js + + # Replace app category to Alerting app + sed -i -e "s|category:{id:\"opensearch\",label:\"OpenSearch Plugins\",order:2e3}|category:${category_explore}|" ./plugins/alertingDashboards/target/public/alertingDashboards.plugin.js + + # Replace app category to Maps app + sed -i -e "s|category:{id:\"opensearch\",label:\"OpenSearch Plugins\",order:2e3}|category:${category_explore}|" ./plugins/customImportMapDashboards/target/public/customImportMapDashboards.plugin.js + + # Replace app category to Notifications app + sed -i -e "s|category:DEFAULT_APP_CATEGORIES.management|category:${category_explore}|" ./plugins/notificationsDashboards/target/public/notificationsDashboards.plugin.js + + # Replace app category to Index Management app + sed -i -e "s|category:DEFAULT_APP_CATEGORIES.management|category:${category_dashboard_management}|g" ./plugins/indexManagementDashboards/target/public/indexManagementDashboards.plugin.js + + # Generate compressed files + files_to_recreate=( + ./plugins/reportsDashboards/target/public/reportsDashboards.plugin.js + ./plugins/alertingDashboards/target/public/alertingDashboards.plugin.js + ./plugins/customImportMapDashboards/target/public/customImportMapDashboards.plugin.js + ./plugins/notificationsDashboards/target/public/notificationsDashboards.plugin.js + ./plugins/indexManagementDashboards/target/public/indexManagementDashboards.plugin.js + ) + + for value in "${files_to_recreate[@]}" + do + gzip -c "$value" > "$value.gz" + brotli -c "$value" > "$value.br" + done + # Enable the default configuration (renaming) cp $config_path/opensearch_dashboards.prod.yml config/opensearch_dashboards.yml cp $config_path/node.options.prod config/node.options diff --git a/src/core/common/logos/__snapshots__/get_logos.test.ts.snap b/src/core/common/logos/__snapshots__/get_logos.test.ts.snap index cfd1b9f7e3cf..c1abadf17f2e 100644 --- a/src/core/common/logos/__snapshots__/get_logos.test.ts.snap +++ b/src/core/common/logos/__snapshots__/get_logos.test.ts.snap @@ -518,29 +518,29 @@ AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" Application.dark.type = "default" -Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" +Application.dark.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_dark.svg" Application.light.type = "default" -Application.light.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_light.svg" +Application.light.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_light.svg" Application.type = "default" -Application.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_light.svg" +Application.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_light.svg" CenterMark.dark.type = "default" -CenterMark.dark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_dark.svg" +CenterMark.dark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_dark.svg" CenterMark.light.type = "default" -CenterMark.light.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_light.svg" +CenterMark.light.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_light.svg" CenterMark.type = "default" -CenterMark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_light.svg" +CenterMark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_light.svg" Mark.dark.type = "default" -Mark.dark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_dark.svg" +Mark.dark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_dark.svg" Mark.light.type = "default" -Mark.light.url = "/mocked/base/path/ui/logos/opensearch_mark_on_light.svg" +Mark.light.url = "/mocked/base/path/ui/logos/wazuh_mark_on_light.svg" Mark.type = "default" -Mark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_light.svg" +Mark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_light.svg" OpenSearch.dark.type = "default" -OpenSearch.dark.url = "/mocked/base/path/ui/logos/opensearch_on_dark.svg" +OpenSearch.dark.url = "/mocked/base/path/ui/logos/wazuh_on_dark.svg" OpenSearch.light.type = "default" -OpenSearch.light.url = "/mocked/base/path/ui/logos/opensearch_on_light.svg" +OpenSearch.light.url = "/mocked/base/path/ui/logos/wazuh_on_light.svg" OpenSearch.type = "default" -OpenSearch.url = "/mocked/base/path/ui/logos/opensearch_on_light.svg" +OpenSearch.url = "/mocked/base/path/ui/logos/wazuh_on_light.svg" colorScheme = "light" `; @@ -552,29 +552,29 @@ AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_dark.gif" Application.dark.type = "default" -Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" +Application.dark.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_dark.svg" Application.light.type = "default" -Application.light.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_light.svg" +Application.light.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_light.svg" Application.type = "default" -Application.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" +Application.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_dark.svg" CenterMark.dark.type = "default" -CenterMark.dark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_dark.svg" +CenterMark.dark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_dark.svg" CenterMark.light.type = "default" -CenterMark.light.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_light.svg" +CenterMark.light.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_light.svg" CenterMark.type = "default" -CenterMark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_dark.svg" +CenterMark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_dark.svg" Mark.dark.type = "default" -Mark.dark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_dark.svg" +Mark.dark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_dark.svg" Mark.light.type = "default" -Mark.light.url = "/mocked/base/path/ui/logos/opensearch_mark_on_light.svg" +Mark.light.url = "/mocked/base/path/ui/logos/wazuh_mark_on_light.svg" Mark.type = "default" -Mark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_dark.svg" +Mark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_dark.svg" OpenSearch.dark.type = "default" -OpenSearch.dark.url = "/mocked/base/path/ui/logos/opensearch_on_dark.svg" +OpenSearch.dark.url = "/mocked/base/path/ui/logos/wazuh_on_dark.svg" OpenSearch.light.type = "default" -OpenSearch.light.url = "/mocked/base/path/ui/logos/opensearch_on_light.svg" +OpenSearch.light.url = "/mocked/base/path/ui/logos/wazuh_on_light.svg" OpenSearch.type = "default" -OpenSearch.url = "/mocked/base/path/ui/logos/opensearch_on_dark.svg" +OpenSearch.url = "/mocked/base/path/ui/logos/wazuh_on_dark.svg" colorScheme = "dark" `; @@ -586,28 +586,28 @@ AnimatedMark.light.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" AnimatedMark.type = "default" AnimatedMark.url = "/mocked/base/path/ui/logos/spinner_on_light.gif" Application.dark.type = "default" -Application.dark.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_dark.svg" +Application.dark.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_dark.svg" Application.light.type = "default" -Application.light.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_light.svg" +Application.light.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_light.svg" Application.type = "default" -Application.url = "/mocked/base/path/ui/logos/opensearch_dashboards_on_light.svg" +Application.url = "/mocked/base/path/ui/logos/wazuh_dashboards_on_light.svg" CenterMark.dark.type = "default" -CenterMark.dark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_dark.svg" +CenterMark.dark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_dark.svg" CenterMark.light.type = "default" -CenterMark.light.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_light.svg" +CenterMark.light.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_light.svg" CenterMark.type = "default" -CenterMark.url = "/mocked/base/path/ui/logos/opensearch_center_mark_on_light.svg" +CenterMark.url = "/mocked/base/path/ui/logos/wazuh_center_mark_on_light.svg" Mark.dark.type = "default" -Mark.dark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_dark.svg" +Mark.dark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_dark.svg" Mark.light.type = "default" -Mark.light.url = "/mocked/base/path/ui/logos/opensearch_mark_on_light.svg" +Mark.light.url = "/mocked/base/path/ui/logos/wazuh_mark_on_light.svg" Mark.type = "default" -Mark.url = "/mocked/base/path/ui/logos/opensearch_mark_on_light.svg" +Mark.url = "/mocked/base/path/ui/logos/wazuh_mark_on_light.svg" OpenSearch.dark.type = "default" -OpenSearch.dark.url = "/mocked/base/path/ui/logos/opensearch_on_dark.svg" +OpenSearch.dark.url = "/mocked/base/path/ui/logos/wazuh_on_dark.svg" OpenSearch.light.type = "default" -OpenSearch.light.url = "/mocked/base/path/ui/logos/opensearch_on_light.svg" +OpenSearch.light.url = "/mocked/base/path/ui/logos/wazuh_on_light.svg" OpenSearch.type = "default" -OpenSearch.url = "/mocked/base/path/ui/logos/opensearch_on_light.svg" +OpenSearch.url = "/mocked/base/path/ui/logos/wazuh_on_light.svg" colorScheme = "light" `; diff --git a/src/core/common/logos/get_logos.ts b/src/core/common/logos/get_logos.ts index 6517cd16ab38..8b27f21d356b 100644 --- a/src/core/common/logos/get_logos.ts +++ b/src/core/common/logos/get_logos.ts @@ -9,18 +9,18 @@ import { ColorScheme, ImageType } from './constants'; import { Branding } from '../../types'; // The logos are stored at `src/core/server/core_app/assets/logos` to have a pretty URL -export const OPENSEARCH_DASHBOARDS_THEMED = 'ui/logos/opensearch_dashboards.svg'; -export const OPENSEARCH_DASHBOARDS_ON_LIGHT = 'ui/logos/opensearch_dashboards_on_light.svg'; -export const OPENSEARCH_DASHBOARDS_ON_DARK = 'ui/logos/opensearch_dashboards_on_dark.svg'; -export const OPENSEARCH_THEMED = 'ui/logos/opensearch.svg'; -export const OPENSEARCH_ON_LIGHT = 'ui/logos/opensearch_on_light.svg'; -export const OPENSEARCH_ON_DARK = 'ui/logos/opensearch_on_dark.svg'; -export const MARK_THEMED = 'ui/logos/opensearch_mark.svg'; -export const MARK_ON_LIGHT = 'ui/logos/opensearch_mark_on_light.svg'; -export const MARK_ON_DARK = 'ui/logos/opensearch_mark_on_dark.svg'; -export const CENTER_MARK_THEMED = 'ui/logos/opensearch_center_mark.svg'; -export const CENTER_MARK_ON_LIGHT = 'ui/logos/opensearch_center_mark_on_light.svg'; -export const CENTER_MARK_ON_DARK = 'ui/logos/opensearch_center_mark_on_dark.svg'; +export const OPENSEARCH_DASHBOARDS_THEMED = 'ui/logos/wazuh_dashboards.svg'; +export const OPENSEARCH_DASHBOARDS_ON_LIGHT = 'ui/logos/wazuh_dashboards_on_light.svg'; +export const OPENSEARCH_DASHBOARDS_ON_DARK = 'ui/logos/wazuh_dashboards_on_dark.svg'; +export const OPENSEARCH_THEMED = 'ui/logos/wazuh.svg'; +export const OPENSEARCH_ON_LIGHT = 'ui/logos/wazuh_on_light.svg'; +export const OPENSEARCH_ON_DARK = 'ui/logos/wazuh_on_dark.svg'; +export const MARK_THEMED = 'ui/logos/wazuh_mark.svg'; +export const MARK_ON_LIGHT = 'ui/logos/wazuh_mark_on_light.svg'; +export const MARK_ON_DARK = 'ui/logos/wazuh_mark_on_dark.svg'; +export const CENTER_MARK_THEMED = 'ui/logos/wazuh_center_mark.svg'; +export const CENTER_MARK_ON_LIGHT = 'ui/logos/wazuh_center_mark_on_light.svg'; +export const CENTER_MARK_ON_DARK = 'ui/logos/wazuh_center_mark_on_dark.svg'; export const ANIMATED_MARK_THEMED = 'ui/logos/spinner.svg'; export const ANIMATED_MARK_ON_LIGHT = 'ui/logos/spinner_on_light.gif'; export const ANIMATED_MARK_ON_DARK = 'ui/logos/spinner_on_dark.gif'; diff --git a/src/core/public/chrome/chrome_service.tsx b/src/core/public/chrome/chrome_service.tsx index c34c4357bbb3..925685caa174 100644 --- a/src/core/public/chrome/chrome_service.tsx +++ b/src/core/public/chrome/chrome_service.tsx @@ -252,7 +252,7 @@ export class ChromeService { forceAppSwitcherNavigation$={navLinks.getForceAppSwitcherNavigation$()} helpExtension$={helpExtension$.pipe(takeUntil(this.stop$))} helpSupportUrl$={helpSupportUrl$.pipe(takeUntil(this.stop$))} - homeHref={http.basePath.prepend('/app/home')} + homeHref={http.basePath.prepend('/app/wz-home')} isVisible$={this.isVisible$} opensearchDashboardsVersion={injectedMetadata.getWazuhVersion()} navLinks$={navLinks.getNavLinks$()} diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index 52378a456579..1c971bfe975e 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -140,50 +140,50 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` "Application": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_dashboards_on_dark.svg", + "url": "/test/ui/logos/wazuh_dashboards_on_dark.svg", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/test/ui/logos/wazuh_dashboards_on_light.svg", }, "type": "default", - "url": "/test/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/test/ui/logos/wazuh_dashboards_on_light.svg", }, "CenterMark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_center_mark_on_dark.svg", + "url": "/test/ui/logos/wazuh_center_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/test/ui/logos/wazuh_center_mark_on_light.svg", }, "type": "default", - "url": "/test/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/test/ui/logos/wazuh_center_mark_on_light.svg", }, "Mark": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_mark_on_dark.svg", + "url": "/test/ui/logos/wazuh_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_mark_on_light.svg", + "url": "/test/ui/logos/wazuh_mark_on_light.svg", }, "type": "default", - "url": "/test/ui/logos/opensearch_mark_on_light.svg", + "url": "/test/ui/logos/wazuh_mark_on_light.svg", }, "OpenSearch": Object { "dark": Object { "type": "default", - "url": "/test/ui/logos/opensearch_on_dark.svg", + "url": "/test/ui/logos/wazuh_on_dark.svg", }, "light": Object { "type": "default", - "url": "/test/ui/logos/opensearch_on_light.svg", + "url": "/test/ui/logos/wazuh_on_light.svg", }, "type": "default", - "url": "/test/ui/logos/opensearch_on_light.svg", + "url": "/test/ui/logos/wazuh_on_light.svg", }, "colorScheme": "light", } @@ -239,7 +239,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` "category": Object { "euiIconType": "managementApp", "id": "management", - "label": "Management", + "label": "Index management", "order": 5000, }, "data-test-subj": "monitoring", @@ -567,7 +567,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -615,7 +615,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` >
@@ -1734,7 +1734,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiCollapsibleNavGroup__children" >
    @@ -2930,7 +2930,7 @@ exports[`CollapsibleNav renders the default nav 3`] = ` >
    @@ -2485,62 +2304,62 @@ exports[`Overview renders without news and features, with solutions 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_dark.svg", + "url": "/ui/logos/wazuh_dashboards_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "CenterMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_dark.svg", + "url": "/ui/logos/wazuh_center_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "Mark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_dark.svg", + "url": "/ui/logos/wazuh_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "OpenSearch": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_on_dark.svg", + "url": "/ui/logos/wazuh_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "colorScheme": "light", } @@ -2955,7 +2774,7 @@ exports[`Overview renders without news and features, with solutions 1`] = ` ], } } - path="/app/opensearch_dashboards_overview" + path="/app/home/" />
@@ -3149,62 +2968,62 @@ exports[`Overview renders without news and solutions, with features 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_dark.svg", + "url": "/ui/logos/wazuh_dashboards_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "CenterMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_dark.svg", + "url": "/ui/logos/wazuh_center_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "Mark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_dark.svg", + "url": "/ui/logos/wazuh_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "OpenSearch": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_on_dark.svg", + "url": "/ui/logos/wazuh_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "colorScheme": "light", } @@ -3259,188 +3078,7 @@ exports[`Overview renders without news and solutions, with features 1`] = ` className="osdOverviewData osdOverviewData--expanded" > - - - -
@@ -4054,62 +3692,62 @@ exports[`Overview renders without news, solutions, and features 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_dark.svg", + "url": "/ui/logos/wazuh_dashboards_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "CenterMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_dark.svg", + "url": "/ui/logos/wazuh_center_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "Mark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_dark.svg", + "url": "/ui/logos/wazuh_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "OpenSearch": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_on_dark.svg", + "url": "/ui/logos/wazuh_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "colorScheme": "light", } @@ -4163,243 +3801,6 @@ exports[`Overview renders without news, solutions, and features 1`] = ` - - -
@@ -5071,62 +4472,62 @@ exports[`Overview renders without news, with solutions and features 1`] = ` "AnimatedMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_dark.svg", + "url": "/ui/logos/spinner_on_dark.gif", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "type": "default", - "url": "/ui/logos/opensearch_spinner_on_light.svg", + "url": "/ui/logos/spinner_on_light.gif", }, "Application": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_dark.svg", + "url": "/ui/logos/wazuh_dashboards_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_dashboards_on_light.svg", + "url": "/ui/logos/wazuh_dashboards_on_light.svg", }, "CenterMark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_dark.svg", + "url": "/ui/logos/wazuh_center_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_center_mark_on_light.svg", + "url": "/ui/logos/wazuh_center_mark_on_light.svg", }, "Mark": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_dark.svg", + "url": "/ui/logos/wazuh_mark_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_mark_on_light.svg", + "url": "/ui/logos/wazuh_mark_on_light.svg", }, "OpenSearch": Object { "dark": Object { "type": "default", - "url": "/ui/logos/opensearch_on_dark.svg", + "url": "/ui/logos/wazuh_on_dark.svg", }, "light": Object { "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "type": "default", - "url": "/ui/logos/opensearch_on_light.svg", + "url": "/ui/logos/wazuh_on_light.svg", }, "colorScheme": "light", } @@ -5485,7 +4886,7 @@ exports[`Overview renders without news, with solutions and features 1`] = ` ], } } - path="/app/opensearch_dashboards_overview" + path="/app/home/" />
From 6427b24bfa0af599126d83ba8f7fe3cb4d844ee3 Mon Sep 17 00:00:00 2001 From: Tostti Date: Tue, 16 Apr 2024 10:46:13 -0300 Subject: [PATCH 16/51] Fix reference in building workflow --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index b0502402152a..67b33a9351be 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -45,7 +45,6 @@ on: required: true default: false - jobs: validate-inputs: runs-on: ubuntu-latest @@ -72,7 +71,7 @@ jobs: build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@master + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_wazuh_plugins }} @@ -161,7 +160,6 @@ jobs: -b file://${{env.CURRENT_DIR}}/artifacts/dashboard-package.zip \ --${{ inputs.system }} ${{ env.PRODUCTION }} - - name: Test package run: | cd ${{ env.CURRENT_DIR }}/dev-tools/test-packages From eb8ca8982ee120631e0a73b6f944ee52c69f171c Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:24:57 -0300 Subject: [PATCH 17/51] Fix tar error in build workflow (#168) --- .../build-packages/base/generate_base.sh | 26 ++++++++++--------- dev-tools/build-packages/base/plugins | 6 +++++ dev-tools/build-packages/deb/launcher.sh | 2 +- dev-tools/build-packages/rpm/launcher.sh | 2 +- 4 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 dev-tools/build-packages/base/plugins diff --git a/dev-tools/build-packages/base/generate_base.sh b/dev-tools/build-packages/base/generate_base.sh index 1580cf4d1d17..20f1385638c3 100755 --- a/dev-tools/build-packages/base/generate_base.sh +++ b/dev-tools/build-packages/base/generate_base.sh @@ -118,7 +118,7 @@ build() { fi tar -zxf wazuh-dashboard.tar.gz - directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) + directory_name=$(ls -t | head -1) working_dir="wazuh-dashboard-$version-$revision-linux-x64" mv $directory_name $working_dir cd $working_dir @@ -127,23 +127,25 @@ build() { echo Building the package... echo - # Install plugins - bin/opensearch-dashboards-plugin install alertingDashboards - bin/opensearch-dashboards-plugin install customImportMapDashboards - bin/opensearch-dashboards-plugin install ganttChartDashboards - bin/opensearch-dashboards-plugin install indexManagementDashboards - bin/opensearch-dashboards-plugin install notificationsDashboards - bin/opensearch-dashboards-plugin install reportsDashboards # Install Wazuh apps and Security app - plugins=$(ls $tmp_dir/applications) - echo $plugins + + plugins=$(ls $tmp_dir/applications)' '$(cat ../../plugins) for plugin in $plugins; do - echo $plugin if [[ $plugin =~ .*\.zip ]]; then - bin/opensearch-dashboards-plugin install file:../applications/$plugin + install='file:../applications/'$plugin + else + install=$plugin + fi + echo "Installing ${plugin%.*} plugin" + if ! bin/opensearch-dashboards-plugin install $install 2>&1 > /dev/null; then + echo "Plugin installation failed" + clean 1 fi done + echo + echo Finished installing plugins + echo # Move installed plugins from categories after generating the package category_explore='{id:"explore",label:"Explore",order:100,euiIconType:"search"}' diff --git a/dev-tools/build-packages/base/plugins b/dev-tools/build-packages/base/plugins new file mode 100644 index 000000000000..6a31dc91f76b --- /dev/null +++ b/dev-tools/build-packages/base/plugins @@ -0,0 +1,6 @@ +alertingDashboards +customImportMapDashboards +ganttChartDashboards +indexManagementDashboards +notificationsDashboards +reportsDashboards diff --git a/dev-tools/build-packages/deb/launcher.sh b/dev-tools/build-packages/deb/launcher.sh index 1ccc701f4f96..2eb463d1139e 100755 --- a/dev-tools/build-packages/deb/launcher.sh +++ b/dev-tools/build-packages/deb/launcher.sh @@ -81,8 +81,8 @@ build_deb() { echo # Prepare the package - directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) tar -zxf wazuh-dashboard.tar.gz + directory_name=$(ls -t | head -1) rm wazuh-dashboard.tar.gz mv $directory_name wazuh-dashboard-base jq '.wazuh.revision="'${revision}'"' wazuh-dashboard-base/package.json > pkgtmp.json && mv pkgtmp.json wazuh-dashboard-base/package.json diff --git a/dev-tools/build-packages/rpm/launcher.sh b/dev-tools/build-packages/rpm/launcher.sh index cc2996240461..0cd7fb16559e 100755 --- a/dev-tools/build-packages/rpm/launcher.sh +++ b/dev-tools/build-packages/rpm/launcher.sh @@ -82,8 +82,8 @@ build_rpm() { echo # Prepare the package - directory_name=$(tar tf wazuh-dashboard.tar.gz | head -1 | sed 's#/.*##' | sort -u) tar -zxf wazuh-dashboard.tar.gz + directory_name=$(ls -t | head -1) rm wazuh-dashboard.tar.gz mv $directory_name wazuh-dashboard-base jq '.wazuh.revision="'${revision}'"' wazuh-dashboard-base/package.json > pkgtmp.json && mv pkgtmp.json wazuh-dashboard-base/package.json From 6bca35940ac55cc847505593f072925644eee599 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:26:30 -0300 Subject: [PATCH 18/51] Fix errors in package build workflow (#169) --- dev-tools/build-packages/base/generate_base.sh | 5 ++--- dev-tools/build-packages/deb/launcher.sh | 4 ++-- dev-tools/build-packages/rpm/launcher.sh | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dev-tools/build-packages/base/generate_base.sh b/dev-tools/build-packages/base/generate_base.sh index 20f1385638c3..ad59dc776bbb 100755 --- a/dev-tools/build-packages/base/generate_base.sh +++ b/dev-tools/build-packages/base/generate_base.sh @@ -76,7 +76,6 @@ build() { echo echo "Downloading dashboards..." echo - if [[ $base =~ $valid_url ]]; then if [[ $base =~ .*\.zip ]]; then if ! curl --output wazuh-dashboard.zip --silent --fail "${base}"; then @@ -118,7 +117,7 @@ build() { fi tar -zxf wazuh-dashboard.tar.gz - directory_name=$(ls -t | head -1) + directory_name=$(ls -td */ | head -1) working_dir="wazuh-dashboard-$version-$revision-linux-x64" mv $directory_name $working_dir cd $working_dir @@ -129,7 +128,7 @@ build() { # Install Wazuh apps and Security app - plugins=$(ls $tmp_dir/applications)' '$(cat ../../plugins) + plugins=$(ls $tmp_dir/applications)' '$(cat $current_path/plugins) for plugin in $plugins; do if [[ $plugin =~ .*\.zip ]]; then install='file:../applications/'$plugin diff --git a/dev-tools/build-packages/deb/launcher.sh b/dev-tools/build-packages/deb/launcher.sh index 2eb463d1139e..dcab4b3653f0 100755 --- a/dev-tools/build-packages/deb/launcher.sh +++ b/dev-tools/build-packages/deb/launcher.sh @@ -82,7 +82,7 @@ build_deb() { # Prepare the package tar -zxf wazuh-dashboard.tar.gz - directory_name=$(ls -t | head -1) + directory_name=$(ls -td */ | head -1) rm wazuh-dashboard.tar.gz mv $directory_name wazuh-dashboard-base jq '.wazuh.revision="'${revision}'"' wazuh-dashboard-base/package.json > pkgtmp.json && mv pkgtmp.json wazuh-dashboard-base/package.json @@ -97,11 +97,11 @@ build_deb() { if [[ ${build_docker} == "yes" ]]; then docker build -t ${container_name} ${dockerfile_path} || return 1 fi - # Build the Debian package with a Docker container if [ ! -d "$out_dir" ]; then mkdir -p $out_dir fi + volumes="-v ${out_dir}/:/tmp:Z -v ${tmp_dir}/wazuh-dashboard.tar.gz:/opt/wazuh-dashboard.tar.gz" docker run -t --rm ${volumes} \ -v ${current_path}/../..:/root:Z \ diff --git a/dev-tools/build-packages/rpm/launcher.sh b/dev-tools/build-packages/rpm/launcher.sh index 0cd7fb16559e..9695f9e8c4df 100755 --- a/dev-tools/build-packages/rpm/launcher.sh +++ b/dev-tools/build-packages/rpm/launcher.sh @@ -83,7 +83,7 @@ build_rpm() { # Prepare the package tar -zxf wazuh-dashboard.tar.gz - directory_name=$(ls -t | head -1) + directory_name=$(ls -td */ | head -1) rm wazuh-dashboard.tar.gz mv $directory_name wazuh-dashboard-base jq '.wazuh.revision="'${revision}'"' wazuh-dashboard-base/package.json > pkgtmp.json && mv pkgtmp.json wazuh-dashboard-base/package.json From d3c021d23350f426b21b8055e1f95c1fa1fff9b0 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Wed, 24 Apr 2024 07:32:11 -0300 Subject: [PATCH 19/51] Add secret for aws region (#171) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 67b33a9351be..123df69c1ba9 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -169,11 +169,11 @@ jobs: -p ${{env.PACKAGE_NAME}} - name: Set up AWS CLI - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.CI_INTERNAL_DEVELOPMENT_BUCKET_USER_ACCESS_KEY }} aws-secret-access-key: ${{ secrets.CI_INTERNAL_DEVELOPMENT_BUCKET_USER_SECRET_KEY }} - aws-region: us-east-1 + aws-region: ${{ secrets.CI_AWS_REGION }} - name: Upload package run: | From c36dd6e983a19058665f86c3ad4e1bec25a1d3e6 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 10 May 2024 10:31:53 -0300 Subject: [PATCH 20/51] Change default theme (#174) --- .github/workflows/build_and_test_workflow.yml | 2 +- packages/osd-ui-shared-deps/theme.ts | 2 +- src/core/server/ui_settings/settings/theme.ts | 2 +- src/core/server/ui_settings/ui_settings_config.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_test_workflow.yml b/.github/workflows/build_and_test_workflow.yml index 69689d019df2..e86e5578bda3 100644 --- a/.github/workflows/build_and_test_workflow.yml +++ b/.github/workflows/build_and_test_workflow.yml @@ -139,7 +139,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] #Removed 'windows-latest' - group: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] + group: [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13] include: - os: ubuntu-latest name: Linux diff --git a/packages/osd-ui-shared-deps/theme.ts b/packages/osd-ui-shared-deps/theme.ts index c803a5e37ef7..d469063feb9e 100644 --- a/packages/osd-ui-shared-deps/theme.ts +++ b/packages/osd-ui-shared-deps/theme.ts @@ -37,7 +37,7 @@ export type Theme = typeof LightTheme; // in the OpenSearch Dashboards app we can rely on this global being defined, but in // some cases (like jest) the global is undefined -export const tag: string = globals.__osdThemeTag__ || 'v8light'; +export const tag: string = globals.__osdThemeTag__ || 'v7light'; export const version = tag.startsWith('v7') ? 7 : 8; export const darkMode = tag.endsWith('dark'); diff --git a/src/core/server/ui_settings/settings/theme.ts b/src/core/server/ui_settings/settings/theme.ts index 94dec047ff35..c1fb6adaca33 100644 --- a/src/core/server/ui_settings/settings/theme.ts +++ b/src/core/server/ui_settings/settings/theme.ts @@ -50,7 +50,7 @@ export const getThemeSettings = (): Record => { name: i18n.translate('core.ui_settings.params.themeVersionTitle', { defaultMessage: 'Theme version', }), - value: 'Next (preview)', + value: 'v7', type: 'select', options: ['v7', 'Next (preview)'], description: i18n.translate('core.ui_settings.params.themeVersionText', { diff --git a/src/core/server/ui_settings/ui_settings_config.ts b/src/core/server/ui_settings/ui_settings_config.ts index 6924640ca1e5..1f71e58bd7ec 100644 --- a/src/core/server/ui_settings/ui_settings_config.ts +++ b/src/core/server/ui_settings/ui_settings_config.ts @@ -56,7 +56,7 @@ const configSchema = schema.object({ overrides: schema.object({}, { unknowns: 'allow' }), defaults: schema.object({ 'theme:darkMode': schema.maybe(schema.boolean({ defaultValue: false })), - 'theme:version': schema.maybe(schema.string({ defaultValue: 'v8' })), + 'theme:version': schema.maybe(schema.string({ defaultValue: 'v7' })), }), }); From 5a302c91a22f2bacf48bfaf89d68d8830b9d3d70 Mon Sep 17 00:00:00 2001 From: Raul Del Pozo Moreno Date: Fri, 17 May 2024 15:20:11 +0200 Subject: [PATCH 21/51] Add ID input to workflows (#179) --- .../build_wazuh_dashboard_with_plugins.yml | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 123df69c1ba9..384a56908069 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -1,4 +1,4 @@ -name: Build packages +run-name: Build packages ${{ inputs.id }} on: workflow_dispatch: @@ -44,6 +44,44 @@ on: description: 'Generate package checksum' required: true default: false + id: + description: "ID used to identify the workflow uniquely." + type: string + required: false + + workflow_call: + inputs: + system: + type: string + required: true + default: 'deb' + architecture: + type: string + required: true + default: amd64 + revision: + type: string + required: true + default: '0' + reference_security_plugins: + type: string + required: true + default: 'master' + reference_wazuh_plugins: + type: string + required: true + default: 'master' + is_stage: + type: boolean + required: true + default: false + checksum: + type: boolean + required: true + default: false + id: + type: string + required: false jobs: validate-inputs: From fb728f98a925577cd56132b9117a6dc8c1bc334b Mon Sep 17 00:00:00 2001 From: Luciano Gorza <103193307+lucianogorza@users.noreply.github.com> Date: Wed, 22 May 2024 10:56:37 -0300 Subject: [PATCH 22/51] Fix css selector to login button (#181) --- src/core/server/core_app/assets/legacy_light_theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/server/core_app/assets/legacy_light_theme.css b/src/core/server/core_app/assets/legacy_light_theme.css index 54b880044ed7..1305f5f6ac52 100644 --- a/src/core/server/core_app/assets/legacy_light_theme.css +++ b/src/core/server/core_app/assets/legacy_light_theme.css @@ -4506,7 +4506,7 @@ input:focus { margin-bottom: 32px; } -div.euiFormRow > div.euiFormRow__fieldWrapper > button { +.wz-login .btn-login { background-color: #3595F9!important; border-color: #3595F9!important; color: #fff; From 71b3edaa9e5379a2268541b8ab9e0e0e0d4adcbb Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Thu, 23 May 2024 15:28:44 -0300 Subject: [PATCH 23/51] Fix error generating packages in branches that contain `/` (#183) --- .github/workflows/build_and_test_workflow.yml | 2 +- .github/workflows/build_base.yml | 6 +++--- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 4 ++-- dev-tools/test-packages/deb/Dockerfile | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_test_workflow.yml b/.github/workflows/build_and_test_workflow.yml index e86e5578bda3..8c4769f92627 100644 --- a/.github/workflows/build_and_test_workflow.yml +++ b/.github/workflows/build_and_test_workflow.yml @@ -139,7 +139,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] #Removed 'windows-latest' - group: [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13] + group: [1, 2, 4, 6, 7, 8, 9, 10, 11, 13] include: - os: ubuntu-latest name: Linux diff --git a/.github/workflows/build_base.yml b/.github/workflows/build_base.yml index 6b011be45faa..0fac06eaa850 100644 --- a/.github/workflows/build_base.yml +++ b/.github/workflows/build_base.yml @@ -27,8 +27,8 @@ jobs: working-directory: ./artifacts strategy: matrix: - DISTRIBUTION: [ tar.gz ] - ARCHITECTURE: [ x64 ] + DISTRIBUTION: [tar.gz] + ARCHITECTURE: [x64] steps: - name: Checkout code @@ -69,7 +69,7 @@ jobs: - name: Get artifact build name run: | - echo "ARTIFACT_BUILD_NAME=wazuh-dashboard_${{ env.WZD_VERSION }}-${{ env.WZD_REVISION }}_${{ matrix.ARCHITECTURE }}_${{ inputs.CHECKOUT_TO }}.${{ matrix.DISTRIBUTION }}" >> $GITHUB_ENV + echo "ARTIFACT_BUILD_NAME=wazuh-dashboard_${{ env.WZD_VERSION }}-${{ env.WZD_REVISION }}_${{ matrix.ARCHITECTURE }}.${{ matrix.DISTRIBUTION }}" >> $GITHUB_ENV - name: Run bootstrap run: yarn osd bootstrap diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 384a56908069..5661710f6e60 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -45,7 +45,7 @@ on: required: true default: false id: - description: "ID used to identify the workflow uniquely." + description: 'ID used to identify the workflow uniquely.' type: string required: false @@ -146,7 +146,7 @@ jobs: - name: Setup packages names run: | - echo "WAZUH_DASHBOARD_SLIM=wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_x64_${{ github.head_ref || github.ref_name }}.tar.gz" >> $GITHUB_ENV + echo "WAZUH_DASHBOARD_SLIM=wazuh-dashboard_${{ env.VERSION }}-${{ env.REVISION }}_x64.tar.gz" >> $GITHUB_ENV echo "WAZUH_SECURITY_PLUGIN=wazuh-security-dashboards-plugin_${{ env.VERSION }}-${{ env.REVISION }}_${{ inputs.reference_security_plugins }}.zip" >> $GITHUB_ENV echo "WAZUH_PLUGINS=wazuh-dashboard-plugins_${{ env.VERSION }}-${{ env.REVISION }}_${{ inputs.reference_wazuh_plugins }}.zip" >> $GITHUB_ENV if [ "${{ inputs.system }}" = "deb" ]; then diff --git a/dev-tools/test-packages/deb/Dockerfile b/dev-tools/test-packages/deb/Dockerfile index 838dc18e398c..3220241e4a30 100644 --- a/dev-tools/test-packages/deb/Dockerfile +++ b/dev-tools/test-packages/deb/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:latest +FROM ubuntu:jammy ARG PACKAGE RUN mkdir -p /tmp RUN apt-get update --fix-missing From 0921fed730d4b880d21d6b07a286227f5702fcec Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Tue, 28 May 2024 10:40:26 -0300 Subject: [PATCH 24/51] Add information to build workflow title (#188) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 5661710f6e60..1b8ffd37beaa 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -1,4 +1,4 @@ -run-name: Build packages ${{ inputs.id }} +run-name: Build ${{ inputs.system }} wazuh-dashboard on ${{ inputs.architecture }} ${{ inputs.is_stage && '- is stage' || '' }} ${{ inputs.checksum && '- checksum' || '' }} ${{ inputs.debug && '- debug' || '' }} ${{ inputs.id }} on: workflow_dispatch: From c252025b4f8b6f5469238fa0f4c5f7bc38c93d77 Mon Sep 17 00:00:00 2001 From: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Date: Fri, 31 May 2024 14:17:22 +0200 Subject: [PATCH 25/51] Build packages with docker (#185) Co-authored-by: Federico Rodriguez --- .../build-packages/wazuh-dashboard.Dockerfile | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 dev-tools/build-packages/wazuh-dashboard.Dockerfile diff --git a/dev-tools/build-packages/wazuh-dashboard.Dockerfile b/dev-tools/build-packages/wazuh-dashboard.Dockerfile new file mode 100644 index 000000000000..640f459f78f0 --- /dev/null +++ b/dev-tools/build-packages/wazuh-dashboard.Dockerfile @@ -0,0 +1,56 @@ +# Usage: docker build --build-arg NODE_VERSION=18.19.0 --build-arg WAZUH_DASHBOARDS_BRANCH=4.9.0 --build-arg WAZUH_DASHBOARDS_PLUGINS=4.9.0 --build-arg WAZUH_SECURITY_DASHBOARDS_PLUGIN_BRANCH=4.9.0 --build-arg OPENSEARCH_DASHBOARDS_VERSION=2.13.0 -t wzd:4.9.0 -f wazuh-dashboard.Dockerfile . + +ARG NODE_VERSION +FROM node:${NODE_VERSION} AS base +ARG OPENSEARCH_DASHBOARDS_VERSION +ARG WAZUH_DASHBOARDS_BRANCH +ARG WAZUH_DASHBOARDS_PLUGINS +ARG WAZUH_SECURITY_DASHBOARDS_PLUGIN_BRANCH +ENV OPENSEARCH_DASHBOARDS_VERSION=${OPENSEARCH_DASHBOARDS_VERSION} +USER root +RUN apt-get update && apt-get install -y git zip unzip curl brotli jq +USER node +RUN git clone --depth 1 --branch ${WAZUH_DASHBOARDS_BRANCH} https://github.com/wazuh/wazuh-dashboard.git /home/node/wzd +RUN chown node.node /home/node/wzd + +WORKDIR /home/node/wzd +RUN yarn osd bootstrap --production +RUN yarn build --linux --skip-os-packages --release + + +WORKDIR /home/node/wzd/plugins +RUN git clone --depth 1 --branch ${WAZUH_SECURITY_DASHBOARDS_PLUGIN_BRANCH} https://github.com/wazuh/wazuh-security-dashboards-plugin.git +RUN git clone --depth 1 --branch ${WAZUH_DASHBOARDS_PLUGINS} https://github.com/wazuh/wazuh-dashboard-plugins.git +WORKDIR /home/node/wzd/plugins/wazuh-security-dashboards-plugin +RUN yarn +RUN yarn build +WORKDIR /home/node/wzd/plugins +RUN mv ./wazuh-dashboard-plugins/plugins/main ./wazuh +RUN mv ./wazuh-dashboard-plugins/plugins/wazuh-core ./wazuh-core +RUN mv ./wazuh-dashboard-plugins/plugins/wazuh-check-updates ./wazuh-check-updates +WORKDIR /home/node/wzd/plugins/wazuh +RUN yarn +RUN yarn build +WORKDIR /home/node/wzd/plugins/wazuh-core +RUN yarn +RUN yarn build +WORKDIR /home/node/wzd/plugins/wazuh-check-updates +RUN yarn +RUN yarn build +WORKDIR /home/node/ +RUN mkdir packages +WORKDIR /home/node/packages +RUN zip -r -j ./dashboard-package.zip ../wzd/target/opensearch-dashboards-${OPENSEARCH_DASHBOARDS_VERSION}-linux-x64.tar.gz +RUN zip -r -j ./security-package.zip ../wzd/plugins/wazuh-security-dashboards-plugin/build/security-dashboards-${OPENSEARCH_DASHBOARDS_VERSION}.0.zip +RUN zip -r -j ./wazuh-package.zip ../wzd/plugins/wazuh-check-updates/build/wazuhCheckUpdates-${OPENSEARCH_DASHBOARDS_VERSION}.zip ../wzd/plugins/wazuh/build/wazuh-${OPENSEARCH_DASHBOARDS_VERSION}.zip ../wzd/plugins/wazuh-core/build/wazuhCore-${OPENSEARCH_DASHBOARDS_VERSION}.zip +WORKDIR /home/node/wzd/dev-tools/build-packages/base +RUN ./generate_base.sh -v 4.9.0 -r 1 -a file:///home/node/packages/wazuh-package.zip -s file:///home/node/packages/security-package.zip -b file:///home/node/packages/dashboard-package.zip +WORKDIR /home/node/wzd/dev-tools/build-packages/base/output +RUN cp ./* /home/node/packages/ + + +FROM node:${NODE_VERSION} +USER node +COPY --chown=node:node --from=base /home/node/wzd /home/node/wzd +COPY --chown=node:node --from=base /home/node/packages /home/node/packages +WORKDIR /home/node/wzd From dfb22c63324a899b8583c046ddd6a6a0542a067c Mon Sep 17 00:00:00 2001 From: Raul Del Pozo Moreno Date: Wed, 5 Jun 2024 12:37:58 +0200 Subject: [PATCH 26/51] Added S3 URI output to package generation upload (#190) --- .../build_wazuh_dashboard_with_plugins.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 1b8ffd37beaa..d056b789a205 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -217,7 +217,14 @@ jobs: run: | echo "Uploading package" aws s3 cp ${{ env.CURRENT_DIR }}/dev-tools/build-packages/output/${{ inputs.system }}/${{env.PACKAGE_NAME}} s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/ - if [ "${{ inputs.checksum }}" = "true" ]; then - echo "Uploading checksum" - aws s3 cp ${{ env.CURRENT_DIR }}/dev-tools/build-packages/output/${{ inputs.system }}/${{env.PACKAGE_NAME}}.sha512 s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/ - fi + s3uri="s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/${{env.PACKAGE_NAME}}" + echo "S3 URI: ${s3uri}" + + + - name: Upload SHA512 + if: ${{ inputs.checksum }} + run: | + echo "Uploading checksum" + aws s3 cp ${{ env.CURRENT_DIR }}/dev-tools/build-packages/output/${{ inputs.system }}/${{env.PACKAGE_NAME}}.sha512 s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/ + s3uri="s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/${{env.PACKAGE_NAME}}.sha512" + echo "S3 sha512 URI: ${s3uri}" From bd9dad238cf5f26f02a03e655e961c01cac0bcbc Mon Sep 17 00:00:00 2001 From: Raul Del Pozo Moreno Date: Thu, 6 Jun 2024 20:16:35 +0200 Subject: [PATCH 27/51] Added missing name statement in package generation workflows (#191) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index d056b789a205..401a15d91cd2 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -1,4 +1,5 @@ run-name: Build ${{ inputs.system }} wazuh-dashboard on ${{ inputs.architecture }} ${{ inputs.is_stage && '- is stage' || '' }} ${{ inputs.checksum && '- checksum' || '' }} ${{ inputs.debug && '- debug' || '' }} ${{ inputs.id }} +name: Build Wazuh dashboard with plugins on: workflow_dispatch: From f58162b5ab3f323fccb0d62281c2288ac46cbb98 Mon Sep 17 00:00:00 2001 From: Federico Rodriguez Date: Thu, 20 Jun 2024 11:38:38 +0200 Subject: [PATCH 28/51] Bump 4.9.0 to revision 01 (#205) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 46cd1b72bfb8..bcfc71451700 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "wazuh": { "version": "4.9.0", - "revision": "00" + "revision": "01" }, "homepage": "https://opensearch.org", "bugs": { @@ -240,7 +240,7 @@ "uuid": "3.3.2", "whatwg-fetch": "^3.0.0", "yauzl": "^2.10.0" - + }, "devDependencies": { "@babel/core": "^7.22.9", From 84efb1fcfa436a7268c2a1a158e477ac67183392 Mon Sep 17 00:00:00 2001 From: Federico Rodriguez Date: Thu, 20 Jun 2024 18:25:10 +0200 Subject: [PATCH 29/51] Change GitHub action version 4.9.0 reference to alpha1 tag (#207) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 401a15d91cd2..a1d859ac5ec1 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha1 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha1 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha1 with: reference: ${{ inputs.reference_security_plugins }} From e14ac7e64c6fcb35c5239f3c005a969e3f19981c Mon Sep 17 00:00:00 2001 From: Federico Rodriguez Date: Fri, 21 Jun 2024 10:22:11 +0200 Subject: [PATCH 30/51] Revert 4.9.0 Github action alpha1 stage (#208) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index a1d859ac5ec1..401a15d91cd2 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha1 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha1 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha1 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_security_plugins }} From bd30be4348acfc5b3905d3d7d052879fb9c9e57d Mon Sep 17 00:00:00 2001 From: Luciano Gorza <103193307+lucianogorza@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:13:58 -0300 Subject: [PATCH 31/51] Add setcap for node fallback (#226) --- dev-tools/build-packages/deb/debian/postinst | 1 + dev-tools/build-packages/rpm/wazuh-dashboard.spec | 1 + 2 files changed, 2 insertions(+) diff --git a/dev-tools/build-packages/deb/debian/postinst b/dev-tools/build-packages/deb/debian/postinst index 232c1d0316ce..87f734aad01b 100644 --- a/dev-tools/build-packages/deb/debian/postinst +++ b/dev-tools/build-packages/deb/debian/postinst @@ -25,6 +25,7 @@ configure) chmod 750 "${TARGET_DIR}""${INSTALLATION_DIR}" chown -R "${NAME}":"${NAME}" "${TARGET_DIR}""${INSTALLATION_DIR}" setcap 'cap_net_bind_service=+ep' "${INSTALLATION_DIR}"/node/bin/node + setcap 'cap_net_bind_service=+ep' "${INSTALLATION_DIR}"/node/fallback/bin/node if [ -f "${INSTALLATION_DIR}"/"${NAME}".restart ]; then rm -f "${INSTALLATION_DIR}"/"${NAME}".restart if command -v systemctl >/dev/null 2>&1 && systemctl >/dev/null 2>&1; then diff --git a/dev-tools/build-packages/rpm/wazuh-dashboard.spec b/dev-tools/build-packages/rpm/wazuh-dashboard.spec index 39e5c924d453..3506f455e601 100644 --- a/dev-tools/build-packages/rpm/wazuh-dashboard.spec +++ b/dev-tools/build-packages/rpm/wazuh-dashboard.spec @@ -125,6 +125,7 @@ fi %post setcap 'cap_net_bind_service=+ep' %{INSTALL_DIR}/node/bin/node +setcap 'cap_net_bind_service=+ep' %{INSTALL_DIR}/node/fallback/bin/node if [ ! -f %{INSTALLATION_DIR}/config/opensearch_dashboards.keystore ]; then runuser %{USER} --shell="/bin/bash" --command="%{INSTALL_DIR}/bin/opensearch-dashboards-keystore create" > /dev/null 2>&1 From ff2b044282b413a549bf767d481893524a894bcd Mon Sep 17 00:00:00 2001 From: Antonio <34042064+Desvelao@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:31:17 +0200 Subject: [PATCH 32/51] Bump 4.9.0 revision 02 (#236) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bcfc71451700..be0b2013e34c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "wazuh": { "version": "4.9.0", - "revision": "01" + "revision": "02" }, "homepage": "https://opensearch.org", "bugs": { From 5f1dfa9832fe43fea5bb60515c65060bc4900777 Mon Sep 17 00:00:00 2001 From: Antonio <34042064+Desvelao@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:32:57 +0200 Subject: [PATCH 33/51] Fix 4.9.0 alpha2 build package GHA (#237) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 401a15d91cd2..1dff93eee19c 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha2 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha2 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha2 with: reference: ${{ inputs.reference_security_plugins }} From ee073f266fbc696d2a155f1de1731cb9d8940f6f Mon Sep 17 00:00:00 2001 From: Antonio <34042064+Desvelao@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:22:25 +0200 Subject: [PATCH 34/51] Revert 4.9.0 Github action alpha2 stage (#238) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 1dff93eee19c..401a15d91cd2 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha2 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha2 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha2 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_security_plugins }} From 8393e16a80afde7226c65922f583afab763db464 Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:17:15 -0300 Subject: [PATCH 35/51] Bump 4.9.0 revision 03 (#252) --- package.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index be0b2013e34c..312e86ceb370 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "wazuh": { "version": "4.9.0", - "revision": "02" + "revision": "03" }, "homepage": "https://opensearch.org", "bugs": { @@ -118,7 +118,6 @@ "**/eslint-plugin-mocha-next/mocha": "npm:mocha@^10.1.0", "**/xml2js": "^0.5.0", "**/yaml": "^2.2.2" - }, "workspaces": { "packages": [ @@ -240,7 +239,6 @@ "uuid": "3.3.2", "whatwg-fetch": "^3.0.0", "yauzl": "^2.10.0" - }, "devDependencies": { "@babel/core": "^7.22.9", @@ -485,4 +483,4 @@ "node": ">=14.20.1 <19", "yarn": "^1.22.10" } -} +} \ No newline at end of file From ed549025b83cc1eb225a094dc1974db46c9326ea Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 19 Jul 2024 12:03:54 -0300 Subject: [PATCH 36/51] Fix 4.9.0 alpha3 build package GHA (#253) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 401a15d91cd2..41263180bfa0 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha3 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha3 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha3 with: reference: ${{ inputs.reference_security_plugins }} @@ -221,7 +221,6 @@ jobs: s3uri="s3://packages-dev.internal.wazuh.com/development/wazuh/4.x/main/packages/${{env.PACKAGE_NAME}}" echo "S3 URI: ${s3uri}" - - name: Upload SHA512 if: ${{ inputs.checksum }} run: | From 7340316fc78c0d2f1243670dce8d00bf40c47f1a Mon Sep 17 00:00:00 2001 From: Nicolas Agustin Guevara Pihen <42900763+Tostti@users.noreply.github.com> Date: Fri, 19 Jul 2024 12:42:53 -0300 Subject: [PATCH 37/51] Revert 4.9.0 Github action alpha3 stage (#254) --- .github/workflows/build_wazuh_dashboard_with_plugins.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_wazuh_dashboard_with_plugins.yml b/.github/workflows/build_wazuh_dashboard_with_plugins.yml index 41263180bfa0..0d2a2f4a7cd6 100644 --- a/.github/workflows/build_wazuh_dashboard_with_plugins.yml +++ b/.github/workflows/build_wazuh_dashboard_with_plugins.yml @@ -103,21 +103,21 @@ jobs: build-base: needs: [validate-inputs] name: Build dashboard - uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@v4.9.0-alpha3 + uses: wazuh/wazuh-dashboard/.github/workflows/build_base.yml@4.9.0 with: CHECKOUT_TO: ${{ github.head_ref || github.ref_name }} build-main-plugins: needs: [validate-inputs] name: Build plugins - uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@v4.9.0-alpha3 + uses: wazuh/wazuh-dashboard-plugins/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_wazuh_plugins }} build-security-plugin: needs: [validate-inputs] name: Build security plugin - uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@v4.9.0-alpha3 + uses: wazuh/wazuh-security-dashboards-plugin/.github/workflows/manual-build.yml@4.9.0 with: reference: ${{ inputs.reference_security_plugins }} From 357409024c4a7f2b35065a569d77beccb02fd33e Mon Sep 17 00:00:00 2001 From: Ian Yenien Serrano <63758389+yenienserrano@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:46:00 +0200 Subject: [PATCH 38/51] Restore the original home icon size (#243) --- .../header/__snapshots__/header.test.tsx.snap | 20 +++++++++---------- .../__snapshots__/home_icon.test.tsx.snap | 4 ++-- .../chrome/ui/header/home_icon.test.tsx | 11 +++++++--- .../public/chrome/ui/header/home_icon.tsx | 4 ++-- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap index 274273277eef..a27ffefac75a 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap @@ -3573,7 +3573,7 @@ exports[`Header handles visibility and lock changes 1`] = ` class="logoImage" data-euiicon-type="/ui/logos/wazuh_mark_on_light.svg" data-test-image-url="/ui/logos/wazuh_mark_on_light.svg" - data-test-subj="homeIcon" + data-test-subj="defaultMark" title="Wazuh dashboards home" />
@@ -3702,8 +3702,8 @@ exports[`Header handles visibility and lock changes 1`] = ` @@ -3711,8 +3711,8 @@ exports[`Header handles visibility and lock changes 1`] = ` className="logoImage" data-euiicon-type="/ui/logos/wazuh_mark_on_light.svg" data-test-image-url="/ui/logos/wazuh_mark_on_light.svg" - data-test-subj="homeIcon" - size="m" + data-test-subj="defaultMark" + size="l" title="Wazuh dashboards home" /> @@ -9111,7 +9111,7 @@ exports[`Header renders condensed header 1`] = ` class="logoImage" data-euiicon-type="/ui/logos/wazuh_mark_on_light.svg" data-test-image-url="/ui/logos/wazuh_mark_on_light.svg" - data-test-subj="homeIcon" + data-test-subj="defaultMark" title="Wazuh dashboards home" />
@@ -9244,8 +9244,8 @@ exports[`Header renders condensed header 1`] = ` @@ -9253,8 +9253,8 @@ exports[`Header renders condensed header 1`] = ` className="logoImage" data-euiicon-type="/ui/logos/wazuh_mark_on_light.svg" data-test-image-url="/ui/logos/wazuh_mark_on_light.svg" - data-test-subj="homeIcon" - size="m" + data-test-subj="defaultMark" + size="l" title="Wazuh dashboards home" /> diff --git a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap index 49cc6839ffdc..ed01d55b6941 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/home_icon.test.tsx.snap @@ -37,8 +37,8 @@ exports[`Home icon, unbranded, uses the mark logo when header is not expanded 1` diff --git a/src/core/public/chrome/ui/header/home_icon.test.tsx b/src/core/public/chrome/ui/header/home_icon.test.tsx index 5b9ce5be58f2..eb33dba62f55 100644 --- a/src/core/public/chrome/ui/header/home_icon.test.tsx +++ b/src/core/public/chrome/ui/header/home_icon.test.tsx @@ -18,7 +18,12 @@ describe('Home icon,', () => { }); it('uses the home icon by default', () => { - const props = mockProps(); + const props = { + ...mockProps(), + branding: { + useExpandedHeader: true, + }, + }; const component = shallow(); const icon = component.find('EuiIcon'); expect(icon.prop('data-test-subj')).toEqual('homeIcon'); @@ -53,9 +58,9 @@ describe('Home icon,', () => { }; const component = shallow(); const icon = component.find('EuiIcon'); - expect(icon.prop('data-test-subj')).toEqual('homeIcon'); + expect(icon.prop('data-test-subj')).toEqual('defaultMark'); expect(icon.prop('type')).toEqual(props.logos.Mark.url); - expect(icon.prop('size')).toEqual('m'); + expect(icon.prop('size')).toEqual('l'); expect(icon.prop('title')).toEqual('Wazuh dashboards home'); expect(component).toMatchSnapshot(); diff --git a/src/core/public/chrome/ui/header/home_icon.tsx b/src/core/public/chrome/ui/header/home_icon.tsx index 3e45c711efcb..db6341cbe116 100644 --- a/src/core/public/chrome/ui/header/home_icon.tsx +++ b/src/core/public/chrome/ui/header/home_icon.tsx @@ -18,7 +18,7 @@ interface Props { */ export const HomeIcon = ({ branding, logos }: Props) => { // Removed prop unnecessary useExpandedHeader Wazuh dashboards - const { applicationTitle = 'Wazuh dashboards' } = branding; + const { applicationTitle = 'Wazuh dashboards', useExpandedHeader } = branding; const { url: markURL, type: markType } = logos.Mark; @@ -27,7 +27,7 @@ export const HomeIcon = ({ branding, logos }: Props) => { let markIconSize: IconSize = 'l'; // If no custom branded mark was set, use `home` icon Wazuh dashboards - if (markType !== 'custom') { + if (markType !== 'custom' && useExpandedHeader) { testSubj = 'homeIcon'; // Home icon should be medium to fit in with other icons markIconSize = 'm'; From 2f99bde896ed562deab1be3b3796ab3f65f6b50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chantal=20Bel=C3=A9n=20kelm?= <99441266+chantal-kelm@users.noreply.github.com> Date: Mon, 22 Jul 2024 10:35:43 -0300 Subject: [PATCH 39/51] Corrections to indexer management and dashboard management in the left menu (#245) --- .../__snapshots__/collapsible_nav.test.tsx.snap | 12 ++++++------ src/core/utils/default_app_categories.ts | 4 ++-- .../application/components/import_flyout.test.tsx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index 1c971bfe975e..6eb7df842f40 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -239,7 +239,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` "category": Object { "euiIconType": "managementApp", "id": "management", - "label": "Index management", + "label": "Indexer management", "order": 5000, }, "data-test-subj": "monitoring", @@ -1592,7 +1592,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` isCollapsible={true} key="management" onToggle={[Function]} - title="Index management" + title="Indexer management" > - Index management + Indexer management @@ -1706,7 +1706,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiTitle euiTitle--xxsmall euiCollapsibleNavGroup__title" id="mockId__title" > - Index management + Indexer management
@@ -1734,7 +1734,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiCollapsibleNavGroup__children" >